2016-10-04 66 views
1

我開發一個WPF應用程序中,我已經處理Exception全球顯示錯誤形式App.xaml.cs。如何在WPF應用程序

對於我已經指MSDN文件。

並據此我的代碼我的主窗口:

private void TestMethod() 
{ 
    string s = null;  
    try 
    { 
    s.Trim(); 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show("A handled exception just occurred: " + ex.Message, "RestartApplication", MessageBoxButton.OK, MessageBoxImage.Warning); 
    } 
s.Trim(); 
} 

在我App.xaml.cs

public App() : base() 
{ 
    this.Dispatcher.UnhandledException += Application_DispatcherUnhandledException; 

} 
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
{ 
    MessageBox.Show("An unhandled exception just occurred: " + e.Exception.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning); 
    e.Handled = true; 
} 

在這裏,我期待2 MessageBox一個例外。並且好像沒有調用Application_DispatcherUnhandledException

但我怎麼能處理來自App.xaml.cs錯誤,並顯示消息框VS給出了第二s.Trim();

錯誤?

我已經指的SO像許多鏈接:
dispatcherunhandledexception-does-not-seem-to-work
globally-catch-exceptions-in-a-wpf-application

更新:實時應用程序代碼,被第二個消息框不顯示:

private void ListProcesses() 
{ 
    string s = null; 

    Process[] localByName = Process.GetProcessesByName("notepad++"); 

    DateTime test = new DateTime(); 
    try 
    { 
     s.Trim(); 

     foreach (Process p in localByName) 
     { 

      this.Dispatcher.Invoke(() => 
      { 
       if (storevalue != p.MainWindowTitle && !String.IsNullOrEmpty(p.MainWindowTitle)) 
       { 
        aTimer.Stop(); 

        this.Visibility = Visibility.Visible; 
        this.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
        this.Topmost = true; 
        this.WindowState = System.Windows.WindowState.Maximized; 
        this.ResizeMode = System.Windows.ResizeMode.NoResize; 
        storevalue = p.MainWindowTitle; 
       } 

      }); 
     } 
    } 
    catch (Exception ex) 
    { 
     aTimer.Stop(); 
     MessageBoxResult result = MessageBox.Show("A handled exception just occurred: " + ex.Message, "RestartApplication", MessageBoxButton.OK, MessageBoxImage.Warning);           
    } 

    s.Trim(); 
} 
+0

'DispatcherUnhandledException'作爲它的名稱說,是爲了處理異常。看到你的代碼,我會期待一個「剛剛發生的處理的異常」,後面跟着「剛剛發生的未處理的異常」... – Pikoh

+0

@Pikoh,我有[MSDN](https://msdn.microsoft.com/zh-cn/ -us/library/system.windows.application.dispatcherunhandledexception.aspx)文件狀態*當應用程序拋出異常但未處理時發生* –

回答

1

Erm..I想想我知道你發生了什麼事。 Dispatcher.UnhandledException事件僅在應用程序運行時才起作用,而不是從Visual Studio運行時起作用。例如,嘗試從Debug文件夾運行它,我想你會看到預期的行爲。

當您從Visual Studio中您的應用程序,VS本身處理異常所以它永遠不會是未處理的,因此從來沒有燒製Dispatcher.UnhandledException事件。

編輯

好,學習你的代碼後,我想你ListProcesses方法在Timer運行。定時器不會將異常傳遞給調用線程,所以它永遠不會工作。如果您正在使用System.Timers.Timer它將默默吞下異常,並且如果使用System.Threading.Timer將終止程序。

因此,在這種情況下,你需要採取例外好好照顧自己,對不起:)

+0

好的,讓我試試。 –

+0

不,它只是顯示第一個消息框! –

+0

我剛剛試過你的代碼,工作得很好。你確定你正在運行exe文件@HinaKhuman? – Pikoh

0

刪除您try/catch塊,並運行「開始不調試(按Ctrl + F5 ) 「。

Application.DispatcherUnhandledException Event 

僅由未處理的異常觸發。

這是我做過什麼:

public partial class Window12 : Window 
{ 
    public Window12() 
    { 
     InitializeComponent(); 

     string id = null; 
     id.Trim(); 
    } 
} 

App.xaml中。cs

public partial class App : Application 
{ 
    public App() 
    { 
     this.DispatcherUnhandledException += App_DispatcherUnhandledException; 
    } 

    void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
    { 
     MessageBox.Show("Unhandled exception occured > " + e.Exception.ToString()); 
    } 
} 
+0

它不工作沒有錯誤。 –

+0

@HinaKhuman如果你刪除try/catch塊,它肯定會奏效。我再次檢查它。 – AnjumSKhan

+0

對不起,實際上我刪除了try catch塊並運行我的'exe'文件,但沒有顯示給我一個消息框。 –