Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 全球试捕_C#_Silverlight_Try Catch_Global - Fatal编程技术网

C# 全球试捕

C# 全球试捕,c#,silverlight,try-catch,global,C#,Silverlight,Try Catch,Global,我知道大家已经讨论了很多,但我还没有找到解决问题的办法 我正在编写一个Silverlight应用程序,其中每个异常都会生成一个MessageBox,上面写着“抱歉给您带来不便” 因为我不能保证我的代码不会出现异常,所以我的同事指示我在每个方法(几百个)中都进行一次尝试捕获,如下所示: public void Method1() { try { ... } catch (Exception e) { MessageBox.Sh

我知道大家已经讨论了很多,但我还没有找到解决问题的办法

我正在编写一个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);
    }
}
[STAThread]
static void Main() { 

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

    Application.ThreadException += ApplicationThreadException;
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
    Run();
}
但这似乎太过分了。我曾经读过这样一篇文章,没有使用try-catch,而且会有很多重复的代码,而且代码会变得模糊,难以阅读


我可以使用全局try-catch等替代方法吗?

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

您的主屏幕将如下所示:

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);
    }
}
[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只是我用来显示错误通知并给出报告说明的一个表单。

在每个方法中尝试捕获是愚蠢的。但是:

您的同事希望您捕获这种程度的异常的原因是什么?您是否让异常滑到了不需要的程度

我有一个与我们的客户已经在使用的产品类似的案例。这是一个类似于silverlight的WPF项目。我的工作是克服旧的坏代码中的错误,这些错误现在还没有人能掌握。该应用程序与windows中的其他程序具有交叉功能,因此无法预见在不同的环境中会出现什么问题

我有这些问题:

  • 由于未捕获的异常,程序停止工作。
  • 为了修复bug,很难理解出了什么问题。我们的客户通常通过电子邮件发送屏幕转储来报告错误,而这些屏幕转储很难看到发生了什么 我的方法是:

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

    • 用户更容易找到解决方法,因为在错误不严重的情况下,他们不会被抛出上下文
    • 当一些意外行为被报告时,过去和现在都更容易理解出什么地方出了问题
    • Oops盒子一开始的频率很高,但我相信该产品现在稳定得更快了,而且Oops盒子更为罕见
    • 直到今天,当客户的电话出现问题时,我会通过电子邮件从他们那里得到电话号码:
    成本如下:

    • 所有用户和系统端点的大型演练
    • 必须重新编写一些逻辑,才能将捕获物放在正确的位置
    总结
    • 异常应该在造成任何损害之前被捕获,比如将用户抛出上下文,并且在一个合理的级别

    • 当用户运行您的程序时,如果发生意外情况,请确保您有一种方法可以为您指明开始查找的位置。为此,我在为此选择的“用户和系统端点”上捕获了其他未处理的异常

    • 无论是否为错误框,请尝试找到一种方法,在出现错误时不将用户抛出上下文。虽然很难让它在所有情况下都起作用,但当它发生时是致命的


    您不希望捕获发生的每个异常。在调用堆栈的上层有几个这样的处理程序可能是有意义的(尽管错误消息是无用的)。但是毫无理由地接受异常是一个非常糟糕的主意。如果你不知道如何处理异常,为什么只显示一个消息框?您应该终止应用程序,因为它现在处于未知状态(假设此异常是
    OutOfMemoryException
    ,是否确实要尝试并继续运行?。@Oded大多数异常都不是致命的,但很少有人知道如何用引发异常的相同方法处理它们。如果每次出现无法在同一位置处理的异常时应用程序都会终止,那么我们甚至无法启动许多应用程序,更不用说对它们做任何错误处理了。明智的做法是让异常冒泡到(1)知道如何处理它或(2)知道没有更高级别的人知道的人那里。@delnan他没有说每个异常都要终止。但是OP不应该捕获所有常规异常,而只是显示一个messagebox,有时会给用户留下一个中断的无响应程序。@delnan-我的观点是关于全局异常处理程序(顶级处理程序)试图进行pokemon异常处理。应该指出的是,为任何异常显示消息框仍然是一种不好的做法(尤其是那些需要终止应用程序的用户)用户界面首选项这可能不是最专业的做法。显示异常消息框的错误做法?为什么?在用户环境中,用户不知道这意味着什么,这可能会让他们更加困惑