全球尝试捕获

时间:2012-03-30 15:14:10

标签: c# silverlight try-catch global

我知道try catch已经讨论了很多,但我还没有找到解决问题的方法。

我正在编写一个Silverlight应用程序,其中每个异常都应生成一个MessageBox,上面写着“抱歉给您带来的不便”。

由于我无法保证我的代码可以免除异常,我的同事已经指示我尝试捕获每种方法(几百个),如下所示:

public void Method1()
{
    try
    {
        ...
    }
    catch (Exception e)
    {
        MessageBox.Show("Something went wrong, we apologize for the inconvenience. \n" + e.Message);
    }
}

public void Method2()
{
    try
    {
        ...
    }
    catch (Exception e)
    {
        MessageBox.Show("Something went wrong, we apologize for the inconvenience. \n" + e.Message);
    }
}

但它似乎太过分了。我已经读过一个不会以这种方式使用try catch加上会有很多重复的代码加上代码将被混淆并且难以阅读。

有没有其他选择,比如我可以使用的全球尝试捕获?

感谢名单! /麦克

3 个答案:

答案 0 :(得分:9)

您随时可以处理AppDomain.UnhandledException Event

答案 1 :(得分:5)

每种方法中的尝试捕获和单一方法是愚蠢的。但是:

您的同事希望您在何种程度上捕获异常的原因是什么?你是否让异常滑落到他们不想要的程度?

我有一个与我们的客户已经使用的产品类似的情况。这是一个类似于silverlight的WPF项目。我的工作是克服旧的错误代码中的错误,没有人仍然与我们合作掌握。应用程序与Windows中的其他程序交叉功能,无法预见在不同环境中可能出现的问题。

我有这些问题

  1. 该程序因未捕获的例外而停止工作。
  2. 很难理解出了什么问题,以便修复错误。我们的客户通常通过电子邮件发送屏幕转储来报告错误,因为很难看到发生了什么。
  3. 我的方法是:

    1. 捕获所选“用户和系统端点”的例外情况。这通常是用户端的按钮单击,拖放,导航命令等的事件处理程序,通常是来自系统端的Windows消息和服务器响应。
    2. 一个类OopsBox,用于在每个catch中处理单行的意外错误。每个catch都有一个尽可能友好的消息,并隐藏在扩展按钮后面的脏东西。该框还用于预期错误的错误消息,在这些情况下,没有展开按钮,也没有脏东西显示,因为我们已经知道出了什么问题。 OopsBox
    3. 我们获得了这个:

      • 当错误不严重时,用户可以更轻松地找出解决方法,因为它们不会脱离上下文。
      • 当报告某些意外行为时,过去和现在仍然更容易理解出现了什么问题。
      • 哎呀盒子以大频率开始,但我相信现在产品稳定得更快,而哎呀盒子则更为罕见。
      • 直到今天,当客户出现问题时,我会通过电子邮件收到他们的电话。 :)

      成本

      • 所有用户和系统端点的大量演练。
      • 必须重新编写一些逻辑才能将捕获物放在正确的位置。

      摘要

      • 例外情况应该在他们造成任何损害之前被捕获,比如将用户从背景中抛弃,并且处于有意义的水平。

      • 当用户运行您的程序并发生意外情况时,请确保您可以指明从哪里开始查找。我通过捕获为此目的而选择的“用户和系统端点”的其他未处理的例外来做到这一点。

      • 错误框与否,尝试找到一种方法,当出现问题时不会将用户抛弃上下文。虽然很难让它在所有情况下都有效,但是当它发生时它是致命的。

答案 2 :(得分:4)

您可以使用Application.ThreadException和AppDomain.CurrentDomain.UnhandledException属性捕获未处理的(和线程)异常。

你的主要看起来像这样:

[STAThread]
static void Main() { 

    if (Debugger.IsAttached) {
        Run();
        return;
    } 

    Application.ThreadException += ApplicationThreadException;
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
    Run();
}

请注意调试器检查,这样调试器就可以在开发时捕获这些异常。

Run功能非常简单

    static void Run() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }

然后是两个异常处理程序。

    static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e) {
        ErrorInformationDialog eid = new ErrorInformationDialog(e.Exception.Message, e.Exception);
        eid.ShowDialog();
    }

    static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) {
        ErrorInformationDialog eid = new ErrorInformationDialog(e.ExceptionObject as Exception);
        eid.ShowDialog();
    }

ErrorInformationDialog只是我放在一起显示错误通知并提供报告说明的表单。