static class Program
{
[STAThread]
static void Main()
{
// Add handler to handle the exception raised by main threads
Application.ThreadException +=
new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
// Add handler to handle the exception raised by additional threads
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
// Stop the application and all the threads in suspended state.
Environment.Exit(-1);
}
static void Application_ThreadException
(object sender, System.Threading.ThreadExceptionEventArgs e)
{// All exceptions thrown by the main thread are handled over this method
ShowExceptionDetails(e.Exception);
}
static void CurrentDomain_UnhandledException
(object sender, UnhandledExceptionEventArgs e)
{// All exceptions thrown by additional threads are handled in this method
ShowExceptionDetails(e.ExceptionObject as Exception);
// Suspend the current thread for now to stop the exception from throwing.
Thread.CurrentThread.Suspend();
}
static void ShowExceptionDetails(Exception Ex)
{
// Do logging of exception details
MessageBox.Show(Ex.Message, Ex.TargetSite.ToString(),
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
7条答案
按热度按时间omvjsjqw1#
如果
#26
是一个异常,那么你可以使用AppDomain.CurrentDomain.UnhandledException
事件。如果它只是一个返回值,那么我看不出有任何机会全局处理它。jxct1oxe2#
由于它是一个winforms应用程序,您可以将
Application.Run(new MainForm());
包含在一个try catch块中。我不知道这种解决方案会引起什么影响,但我只是告诉你你需要什么。
其他选项是订阅Application.ThreadException事件。
点击此处阅读更多信息:unhandledexceptions
还有AppDomain.UnhandledException,您应该阅读它们之间的差异here on MSDN。
来自MSDN:
sgtfey8w3#
通过参考Centralized Exception Handling在C# Windows中的应用,我找到了一个很好的解决方案:
在上面的类中,我们将把一个事件处理程序附加到两个事件上。最好是在main方法一开始就附加这些事件。
Application.ThreadException-当在主线程中抛出异常时将引发此事件。如果添加事件处理程序,则通过方法处理异常。
AppDomain.CurrentDomain.UnhandledException-当应用程序中使用的其他线程抛出异常时,将引发此事件。更糟糕的情况是,一旦处理程序的执行结束,异常再次抛出,而应用程序结束。这需要处理。这里我使用了一些代码来处理这种情况,并继续执行应用程序而不中断。
我用来克服这种情况的逻辑是在事件处理程序中挂起线程,以便应用程序继续正常工作。挂起此线程时又出现了一个问题。当主窗体关闭时,应用程序通常需要退出,但由于线程处于挂起状态,应用程序仍将保持运行。因此,要完全退出应用程序并停止进程,必须在main方法结束之前调用Environment.Exit(-1)。
ig9co6j14#
首先,您应该添加:
之后,您可以捕获异常,例如:
xjreopfe5#
行程Application.ThreadException事件。
irlmq6kh6#
winforms中的全局错误拦截
9wbgstp77#
作为上面所示内容的扩展,我使用以下内容:
...其中HandleException()方法可以类似于:
另一种剥这只猫皮的方法是:
当然,您可以在Unhandled()方法中做任何您想做的事情。