【问题标题】:Global Exception Handler implementation C# WinForms全局异常处理程序实现 C# WinForms
【发布时间】:2020-12-21 00:44:23
【问题描述】:

我正在尝试实现一个全局“try catch 块”并在处理完任何内容后保持我的应用程序运行:

public class GlobalExceptionHandler
{
    public GlobalExceptionHandler()
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    }
    private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        try
        {
            throw (e.ExceptionObject as Exception);
        }
        catch (Exception ex)
        {
        }
    }
}

问题:

  1. 我希望使用 try catch 块以熟悉的方式处理所有异常。我把它们扔回去抓是不是做错了什么?
  2. 上面的代码仍然丢弃了应用程序,并在最初抛出异常的地方弹出异常,就像它没有被处理一样。
  3. 猜我的方法从一开始就完全失败了。我想避免在整个应用程序中使用大量 try catch 块,并决定本地化所有异常处理。这个想法有多好?我应该找到更好的方法来实现全局处理程序还是坚持使用数十个 try catch 块?

【问题讨论】:

  • 处理意外异常应该不会很麻烦。如果您有很多 try/catch 块,则听起来其余代码中的验证可能存在问题。如果您验证公共方法中的参数,然后处理预期的异常(您知道如何从中恢复),那么您应该让任何其他异常冒泡,以便您知道它们是什么并且可以添加逻辑来处理它们。
  • 一个空的catch块会吞下所有的异常,所以当你从trythrow然后吞下catch中的异常时,什么都不会发生。
  • 1.我也想处理预期的。然后根据发生的异常类型在状态栏组件中设置通知。所有这些都集中在一个地方。 2.应用程序在到达处理程序的异常上崩溃,而不是在处理程序内重新抛出的异常上

标签: c# winforms design-patterns


【解决方案1】:

windows 窗体有单独的event 用于处理 GUI 线程上的异常(即发生在 GUI 事件上的异常,如按钮单击、文本框文本更改等):

Application.ThreadException += new ThreadExceptionEventHandler(Handler);
    
public void Handler(object sender, ThreadExceptionEventArgs t)
{
        //exceptions handling code here...
        

        // you can throw exception at the end of method if you want this exception to go unhandled, not writing throw will swallow exception
        /// throw t.Exception
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2014-04-17
    • 2012-12-31
    • 2011-05-19
    • 2011-08-31
    • 2010-12-05
    • 1970-01-01
    相关资源
    最近更新 更多