如何在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();
}
嗯…我想我知道你怎么了。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());
}
}