【问题标题】:Should I derive custom exceptions from Exception or ApplicationException in .NET?我应该从 .NET 中的 Exception 或 ApplicationException 派生自定义异常吗?
【发布时间】:2010-09-08 08:10:48
【问题描述】:

在 .NET 解决方案中创建异常类时的最佳做法是:从 System.ExceptionSystem.ApplicationException 派生?

【问题讨论】:

    标签: .net exception


    【解决方案1】:

    根据框架设计指南一书中的 Jeffery Richter:

    System.ApplicationException 是一个不应属于 .NET 框架的类。

    它的目的是为了有一些意义,因为您可以潜在地捕获“所有”应用程序异常,但没有遵循该模式,因此它没有任何价值。

    【讨论】:

    • 令人难以置信的是,当人们想到 Microsoft Press 为 MCTS 70-536 考试提供的材料清楚地表明相反的情况时……哎呀!
    • 永远不要完全相信 MS 考试书籍。我读过的很少——总是充满错误。
    • 这实际上并没有回答问题。你是说自定义应用程序异常应该继承自Exception?如果是的话,你能这么说吗?
    【解决方案2】:

    您应该从 System.Exception 派生自定义异常。

    现在连 MSDN 都说要忽略 ApplicationException

    如果您正在设计应用程序 需要创建自己的 例外,建议您导出 来自 Exception 的自定义异常 班级。原本以为 自定义异常应该来自 ApplicationException 类; 然而在实践中,这并没有 发现增加了显着的价值。为了 更多信息,请参阅Best Practices for Handling Exceptions

    http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx

    【讨论】:

    • 引用确实这么说,但是好的,编辑得更明确。
    【解决方案3】:

    ApplicationException considered useless 是反对ApplicationException 的有力且批判性的论据。

    结果:不要使用它。派生自Exception

    【讨论】:

    • 是的,康拉德说得对。在相关说明中:另一件事被认为有用(或“最佳实践”)但实际上不是implementing ICloneable
    【解决方案4】:
    【解决方案5】:

    我习惯这样做:

    private void buttonFoo_Click()
    {
        try
        {
           foo();
        } 
        catch(ApplicationException ex)
        {
          Log.UserWarning(ex);
          MessageVox.Show(ex.Message);
        }
        catch(Exception ex)
        {
           Log.CodeError(ex);
           MessageBox.Show("Internal error.");
        }
    }
    

    它允许做以下区别:

    • 我必须修复的 C# 代码系统错误。
    • “正常”用户错误,不需要我更正。

    我知道不建议使用 ApplicationException,但它的效果很好,因为有 very few classes 不遵守 ApplicationException 模式。

    【讨论】:

    • 你知道的很少。任何遵循框架设计指南的人都不会派生自 ApplicationException。如果您想保持这种模式,那么您需要创建自己的类型,例如 MyApplicationExcptionBase 并从中派生所有自定义异常。顺便说一句,指南说要创建一些派生异常类型。
    • 你说得对:今天,如果我必须从头开始,我将创建一个“UserError”异常。尽管如此,我不会重构我的旧代码:它不是很受批评。
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2012-08-14
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多