12

VS2008 で新しい WPF プロジェクトを開始し、trap にコードを追加しましたDispatcherUnhandledException。次に、スロー例外を追加しましたWindow1 が、エラーはハンドラーによってトラップされません。なんで?

   public App()
    {
        this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);

    }

    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        System.Windows.MessageBox.Show(string.Format("An error occured: {0}", e.Exception.Message), "Error");
        e.Handled = true;
    }

 void Window1_MouseDown(object sender, MouseButtonEventArgs e)
    {
        throw new NotImplementedException();
    }
4

5 に答える 5

5

これは、デバッガーが例外を処理する方法が原因で発生する可能性があります-デバッグ/例外... では、処理方法を正確に構成できるはずです。

于 2008-12-24T17:29:48.577 に答える
3

これが私がそれを処理する方法です。これはきれいではありませんが、このタイプのエラーが開発者としてのデバッグを過ぎてはならないことに注意してください。これらのエラーは、本番環境に移行する前に長い間解決する必要があります (したがって、これがきれいでなくても問題ありません)。Startup プロジェクトの App.xaml (App.xaml.cs) コード ビハインドに、次のコードを配置しました。

  • OnStartup、DispatcherUnhandledException イベント ハンドラーを作成する
  • ハンドラーで、MessageBox を使用してメッセージを表示します。起動ウィンドウがまだ作成されていない可能性が高いため、ウィンドウに配置しようとしないでください。
  • e. エラーを処理する
  • 追加の内部エラーがいつ発生するかを確認したいので、内部エラーが null になるまで表示ウィンドウを呼び出し続けます。

コード ブロックの特殊文字がこれを正しくフォーマットしていない理由がわかりません。申し訳ありません。

protected override void OnStartup(StartupEventArgs e)
    {
        // define application exception handler
        Application.Current.DispatcherUnhandledException += 
            AppDispatcherUnhandledException;

        // defer other startup processing to base class
        base.OnStartup(e);
    }

    private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        runException(e.Exception);

        e.Handled = true;   
    }

    void runException(Exception ex)
    {
        MessageBox.Show(
            String.Format(
                "{0} Error:  {1}\r\n\r\n{2}",
                ex.Source, ex.Message, ex.StackTrace,
                "Initialize Error",
                MessageBoxButton.OK, 
                MessageBoxImage.Error));

        if (ex.InnerException != null)
        {
            runException(ex.InnerException);
        }
    }
于 2016-03-02T17:16:06.637 に答える
3

次のmsdnリンクを見てください http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx 以下はここに関連しています

バックグラウンド ユーザー インターフェイス (UI) スレッド (独自の Dispatcher を持つスレッド) またはバックグラウンド ワーカー スレッド (Dispatcher を持たないスレッド) で例外が処理されない場合、例外はメイン UI スレッドに転送されません。したがって、DispatcherUnhandledException は発生しません。このような状況では、次のことを行うコードを記述する必要があります。

  1. バックグラウンド スレッドで例外を処理します。
  2. これらの例外をメイン UI スレッドにディスパッチします。
  3. DispatcherUnhandledException が発生するように、それらを処理せずにメイン UI スレッドで再スローします。
于 2009-12-03T08:30:34.940 に答える
2

最初は、デバッグ環境の外でも、ハンドラーがトリガーされていないように見えます...そして、e.Handled = trueを設定するのを忘れていることに気付きました。

実際には機能していましたが、 e.Handled がまだ false だったため、標準の例外ハンドラーがまだ開始され、機能していました。

e.Handled = true を設定すると、すべてがうまくいきました。そのため、うまくいかない場合は、その手順を完了したことを確認してください。

于 2009-04-16T19:01:20.990 に答える
1

興味のある方へ

IDE はまだ例外で中断しているようで、IDE で [続行] をクリックすると、エラー ハンドラが呼び出されます。

于 2008-12-24T07:32:07.847 に答える