2016-10-04 3 views
1

私はExceptionをグローバルに処理する1つのWPFアプリケーションを開発しています。WPFアプリケーションでエラーフォームApp.xaml.csを表示する方法

私はMSDNのドキュメントを参照しました。

し、それに応じて私のメインウィンドウ上の私のコード:ここに私の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; 
} 

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(); 
} 

私は例外の2 MessageBoxを期待。 Application_DispatcherUnhandledExceptionが呼び出されていないようです。

しかし、VSはどのように私はApp.xaml.csからのエラーおよびshowメッセージボックスを扱うことができる二s.Trim();

にエラーが発生しますか?
dispatcherunhandledexception-does-not-seem-to-work
globally-catch-exceptions-in-a-wpf-application

更新:リアルタイムアプリケーションコード、2番目のメッセージボックスが表示されませんでした。

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'という名前の通り、Not Handed Exceptionです。あなたのコードを見て、私は "処理された例外が発生しました"と "未処理の例外が発生しました"というメッセージが表示されることを期待します... – Pikoh

+0

@Pikoh、[MSDN](https://msdn.microsoft.com/ja) -us/library/system.windows.application.dispatcherunhandledexception.aspx)ドキュメントは状態です*アプリケーションによって例外がスローされたが処理されなかった場合に発生します* –

答えて

1

Erm..I

は私がきたSOのような多くのリンクを参照してください。私はあなたに何が起こっているか知っていると思う。 Dispatcher.UnhandledExceptionイベントは、アプリケーションが実行されているときにのみ動作し、Visual Studioから実行したときには機能しません。たとえば、Debugフォルダから実行しようとすると、予想される動作が表示されると思います。

Visual Studioからアプリケーションを実行すると、VS自体が例外を処理しているため、処理されないため、Dispatcher.UnhandledExceptionイベントは発生しません。

EDIT

[OK]を、あなたのコードを学んだ後、私はあなたのListProcesses方法がTimerで実行されていると思います。タイマーは呼び出しスレッドに例外を渡さないため、うまく動作しません。 System.Timers.Timerを使用している場合は、例外を静かに飲み込み、System.Threading.Timerを使用するとプログラムが終了します。

ので、その場合には、あなたは申し訳ありませんが、例外の自分を世話をする必要があります:)

+0

OK、試してみましょう。 –

+0

いいえ、最初のメッセージボックスを表示しているだけです! –

+0

私はちょうどあなたのコードを試して、うまく動作します。 @HinaKhumanというexeファイルを実行していますか? – 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'ファイルを実行しましたが、メッセージボックスは表示されませんでした。 –

関連する問題