C# windows 应用程序中的全局级错误处理

Posted

技术标签:

【中文标题】C# windows 应用程序中的全局级错误处理【英文标题】:Global level error handling in C# windows application 【发布时间】:2013-12-17 23:09:20 【问题描述】:

我正在尝试在我的 Windows 应用程序中实现全局级别的错误处理

我有创建一些错误的表单的按钮单击事件

  label1.Text =
            class1.Calculate(Convert.ToSingle(textBox1.Text), Convert.ToSingle(textBox2.Text))
                  .ToString(CultureInfo.InvariantCulture);

        MessageBox.Show("That was really Close");

现在我想让控件转到消息框,未处理的错误正在主函数中处理为

private static void Main()
    

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
        Application.Run(new Form1());
    
    private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    
        if (e.Exception.InnerException != null)
            MessageBox.Show(e.Exception.InnerException.Message.ToString());
        else MessageBox.Show(e.Exception.ToString());
     

此代码示例确实处理了异常,但我希望将控件返回到单击按钮,即 MessageBox.Show("That was really Close");应该在异常处理后调用

【问题讨论】:

所以你实际上想要VB的On Error Resume Next?欢乐时光:D 对 VB 没有任何想法 ;) 【参考方案1】:

如果您不希望方法在出现异常时停止,那么您需要在此时处理异常。您可以让 catch 调用某种全局错误处理方法,但您需要在该方法中使用 try catch。

全局级别的异常处理是针对你不能立即处理并且需要在程序终止之前捕获的异常,通常用于日志记录等。

全局级异常处理不能替代在正确位置处理异常。如果您希望代码抛出异常并且这是您可以处理的异常,那么您应该在代码的该点放置一个 try/catch。在上面的示例中,您说要继续运行该方法,很明显错误不是致命错误,因此您应该以正常方式处理它。

通常应该注意的是,您可以处理的异常是可以避免的。例如,在传递方法之前检查传递给方法的内容。不能完全删除的通常是与外部资源有关的(例如读取文件)。我敢肯定还有很多其他例外,但正如有人曾经说过的那样“例外是针对特殊情况的”。如果你能预见到它们,你应该尽量避免它们。

在这种情况下,我假设异常与文本框中的无效输入有关。在这种情况下,您应该使用Single.TryParse 来验证输入,然后再将其传递给您的方法。如果其中任何一个值无法解析,您可以让用户正确地知道这一点。

【讨论】:

是的,我就是这么想的,难道没有别的办法。如果我必须尝试捕获每个方法,那么全局级异常处理程序有什么用 @PankajBhandari:答案更新了更多关于异常处理的 cmets。 感谢队友的解释...是的,在我们可以预见的地方应该避免异常...在上述情况下,这只是举例...当然应该使用 tryparse 而不是直接解析... @PankajBhandari:当我写这篇文章时,我不确定上面是否是要演示的示例代码。希望我涵盖了初学者的案例以及更高级的案例...... :)

以上是关于C# windows 应用程序中的全局级错误处理的主要内容,如果未能解决你的问题,请参考以下文章

如何处理应用程序级别的“值'0000-00-00'不能表示为java.sql.Timestamp”错误?

如何处理应用内计费库中的多个用户? (最佳实践)

PHP - 如何处理应该存在于应用程序命名空间中的真实测试双打?

Azure 通知中心:安装 ID 以及如何处理应用程序的卸载

当我想关闭套接字时如何处理应用程序终止?

找不到使用 C# 在 openGL 中将纹理应用于 3d 对象的方法