全球尝试捕获

use*_*236 8 c# silverlight 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

有没有像我可以使用的全球尝试捕捉的替代方案?

感谢名单!/麦克风

JOG*_*JOG 6

每种方法中的尝试捕获和单一方法都很愚蠢.但:

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

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

我有这些问题:

  1. 由于未被捕获的异常,程序停止工作.
  2. 为了修复错误,很难理解出了什么问题.我们的客户通常通过电子邮件发送屏幕转储来报告错误,因为很难看到发生了什么.

我的方法是:

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

我们获得了这个:

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

花费了这个:

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

摘要

  • 异常应该在它们造成任何损害之前被捕获,例如将用户抛弃在上下文之外,并且在有意义的级别中.

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

  • 错误框与否,尝试找到一种方法,当出现问题时不要将用户抛出上下文.但是在所有情况下很难使它工作,但是当它发生时它是致命的.


小智 5

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

您的Main看起来像这样:

[STAThread]
static void Main() { 

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

    Application.ThreadException += ApplicationThreadException;
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
    Run();
}
Run Code Online (Sandbox Code Playgroud)

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

运行功能非常简单

    static void Run() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
Run Code Online (Sandbox Code Playgroud)

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

    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();
    }
Run Code Online (Sandbox Code Playgroud)

而且ErrorInformationDialog只是我汇总在一起用来显示错误通知并提供报告错误指示的一种形式。