2012-01-26 28 views
2

我拋出各種自定義異常,儘管我的代碼。處理全局異常而不殺應用程序?

其中一些是可恢復的,所以我想要一個全局處理程序來捕捉它們,顯示警告,然後繼續。

我找到AppDomain.UnhandledException事件,它有一個IsTerminating參數,但是這是隻讀的。

是否有一些事件或其他方式來捕捉全局的異常仍然讓你處理它們並進行?

(這是形式,但我會在WPF的解決方案太有趣)

+1

可能重複:[鏈接](http://stackoverflow.com/questions/4862841/how-to-create-global-error-處理程序在Windows窗體應用程序) – StaWho

回答

0

已找到解決方案。使用Application.ThreadException而不是AppDomain.UnhandledException。但你也必須告訴它在UI線程上給予例外太:

public static void SetupGlobalExceptionHandler() 
{ 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
    Application.ThreadException += OnException; 
} 

static void OnException(object sender, ThreadExceptionEventArgs args) 
{ 
    MessageBox.Show("There was a problem. Error is:\n\n" + args.Exception.Message); 
} 
0

您可以使用在Global.asax和

void Application_Error(object sender, EventArgs e) 
{ 
} 

事件趕上這不是錯誤被抓到頁面上。

在此,你可以使用多種方法,但這樣的一個方法是這樣的:

void Application_Error(object sender, EventArgs e) 
{ 
    Exception opException = Server.GetLastError(); 

    switch (opException.GetBaseException().GetType().Name) 
    { 
     case "OptimisticConcurrencyException": 
         //display a friendly message 
        break; 
    } 


    Server.ClearError(); 

} 

或類似的東西

+0

正如我所說這是形式,而不是ASP。 – GazTheDestroyer

+1

對不起,我的錯誤,我聽到'Forms'並且只是假設'WebForms'! * facepalm * – dougajmcdonald

0

試着這麼做:

AppDomain.CurrentDomain.UnhandledException += AppDomainUnhandledException; 

public static void AppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    // You might have to try changing this to your custom exception type and then have overloads or pass it as an object and cast it in the HandleException method 
    HandleException(e.ExceptionObject as Exception); 
} 

private static void HandleException(Exception exception) 
{ 
    if (exception == null) return; 

    // Do a check in here against the exceptions that you want to handle or don't want to handle and either display a message, log, quit, etc 
} 

沒有注意到winforms,我很長一段時間沒有做表格,所以這是WPF,可能工作或可能需要調整。

+0

這正是我已經在做的。在事件觸發時,運行時已經決定殺死該應用程序。我所能做的只是顯示一條消息。 – GazTheDestroyer

+0

@GazTheDestroyer如果你用try/catch封裝你的主應用程序運行命令並把它傳遞給HandleException,你應該可以自己調用關機/退出 – John

+0

如果我打包Application.Run,​​那麼它將在拋出異常時退出。我不想退出該應用程序。 – GazTheDestroyer