如何在WPF应用程序中显示错误表单app . example .cs

本文关键字:表单 错误 app example cs 显示 WPF 应用程序 | 更新日期: 2023-09-27 18:11:37

我正在开发一个WPF应用程序,在这个应用程序中,我必须全局处理Exception

我参考了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();
}

In my 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;
}

这里我期待两个MessageBox异常。似乎没有呼叫Application_DispatcherUnhandledException

但是VS给出第二个s.Trim();的错误

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

我引用了很多SO的链接,比如:
dispatcherunhandleexception -do -not- 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();
} 

如何在WPF应用程序中显示错误表单app . example .cs

嗯…我想我知道你怎么了。Dispatcher.UnhandledException事件仅在应用程序运行时起作用,而不是在从Visual Studio运行时起作用。例如,试着从Debug文件夹运行它,我想你会看到预期的行为。

当你在Visual Studio中运行你的应用程序时,VS本身正在处理异常,所以它永远不会被处理,因此永远不会触发Dispatcher.UnhandledException事件。

编辑

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

所以在这种情况下,你需要自己处理异常,抱歉:)

删除try/catch块,并运行"Start Without Debugging (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());
    }
}