关于c#:如何在WPF应用程序中显示错误形式App.xaml.cs

How to display error form App.xaml.cs in WPF Application

我正在开发一个WPF应用程序,其中我必须在全球范围内处理Exception

为此,我参考了MSDN号文件。

相应地,我在主窗口上的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
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();
}

在我的电脑里

1
2
3
4
5
6
7
8
9
10
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;
}

在这里,我希望有两个MessageBox作为例外。好像Application_DispatcherUnhandledException没有打电话。

但是vs在第二个s.Trim();上给出了一个错误。

如何处理错误并显示来自App.xaml.cs的消息框?

我引用了许多这样的链接:DispatcherUnhandledException似乎不起作用global-catch-exceptions-in-a-wpf-应用程序

更新:实时应用程序代码,是否第二个消息框未显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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();
}


呃……我想我知道你怎么了。Dispatcher.UnhandledException事件仅在应用程序运行时有效,而不是在从Visual Studio运行时。例如,尝试从debug文件夹运行它,我认为您将看到预期的行为。

当您从Visual Studio运行应用程序时,vs本身正在处理异常,因此它永远不会被处理,因此永远不会触发Dispatcher.UnhandledException事件。

编辑

好的,在研究了代码之后,我想您的ListProcesses方法正在Timer中运行。计时器不会将异常传递给调用线程,因此它将永远不会工作。如果使用System.Timers.Timer,它将静默地接受异常;如果使用System.Threading.Timer,它将终止程序。

因此,在这种情况下,您需要自己处理例外情况,抱歉:)


删除Try/Catch块,然后运行"无调试启动(ctrl+f5)"。

1
Application.DispatcherUnhandledException Event

仅由未处理的异常激发。

我就是这样做的:

1
2
3
4
5
6
7
8
9
10
public partial class Window12 : Window
{
    public Window12()
    {
        InitializeComponent();

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

代码文件

1
2
3
4
5
6
7
8
9
10
11
12
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());
    }
}