捕获Windows窗体应用程序中的应用程序异常

本文关键字:应用程序 异常 捕获 窗体 Windows | 更新日期: 2023-09-27 17:58:41

是否有任何东西可以捕获代码中任何地方抛出的期望?我希望捕获异常并以类似的方式处理它们,而不是为每个功能编写try-catch块。

捕获Windows窗体应用程序中的应用程序异常

在Windows窗体应用程序中,当应用程序中的任何位置(主线程上或异步调用期间)引发异常时,您可以通过在应用程序上注册ThreadException事件来捕获它。通过这种方式,您可以以相同的方式处理所有异常。

Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod);
private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t)
{
    //Exception handling...
}

我认为这已经接近尾声,因为您可以在获胜表单应用程序中找到您想要的内容。

http://msdn.microsoft.com/en-us/library/ms157905.aspx

// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
// Set the unhandled exception mode to force all Windows Forms errors to go through
// our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Add the event handler for handling non-UI thread exceptions to the event. 
AppDomain.CurrentDomain.UnhandledException +=
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

如果不执行所有这些步骤,您将面临一些异常无法处理的风险。

显而易见的答案是将异常处理程序放在执行链的顶部。

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    try
    {
        Application.Run(new YourTopLevelForm());
    }
    catch
    {
        //Some last resort handler unware of the context of the actual exception
    }
}

这将捕获在主GUI线程上发生的任何异常。如果您还想全局捕获发生在所有线程上的异常,您可以订阅AppDomain.UnhandledException事件并在那里进行处理。

Application.ThreadException +=
    new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod)
private static void MyCommonExceptionHandlingMethod(
                                              object sender,
                                              ThreadExceptionEventArgs t)
{
    //Exception handling...
}

代码复制自Charith J的答案

现在来听听建议。。。

这些选项只能作为最后的手段使用,比如说,如果你想在向用户展示时抑制意外的未捕获异常。当你对异常的上下文有所了解时,你应该尽可能快地发现。更好的是,你可能会对这个问题采取一些措施。

结构化异常处理可能看起来是一种不必要的开销,您可以使用catch-all来解决它,但它的存在是因为事实并非如此。更重要的是,当开发人员对逻辑记忆犹新时,这项工作应该在编写代码时完成。不要懒惰,把这项工作留给以后,或者让一些更专业的开发人员来做。

如果你已经知道并这么做了,请道歉。

您可以订阅AppDomain.UnhandledException Event