繁体   English   中英

在 Windows Forms 应用程序中捕获应用程序异常

[英]Catch Application Exceptions in a Windows Forms Application

有没有办法捕捉代码中任何地方抛出的期望? 我想捕获异常并以类似的方式处理它们,而不是为每个功能编写 try catch 块。

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

Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod);

private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t)
{
    //Exception handling...
}

我认为这是一个结束,因为您可以在 win 表单应用程序中找到您正在寻找的内容。

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...
}

现在上建议...

这些选项只应作为最后的手段使用,例如,如果您想抑制意外未捕获的异常从呈现给用户。 当您对异常的上下文有所了解时,您应该尽可能早地捕捉到。 更好的是,你也许可以对这个问题做点什么。

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

抱歉,如果您已经知道并这样做了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM