我应该从.NET中的Exception或ApplicationException派生自定义异常吗?

我应该从.NET中的Exception或ApplicationException派生自定义异常吗?

Should I derive custom exceptions from Exception or ApplicationException in .NET?

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


根据Jeffery Richter在《框架设计指南》一书中所说:

System.ApplicationException is a class that should not be part of the .NET framework.

它旨在具有某些意义,因为您可能会捕获"所有"应用程序异常,但是未遵循该模式,因此它没有任何价值。


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

现在甚至MSDN都说忽略ApplicationException

If you are designing an application
that needs to create its own
exceptions, you are advised to derive
custom exceptions from the Exception
class. It was originally thought that
custom exceptions should derive from
the ApplicationException class;
however in practice this has not been
found to add significant value. For
more information, see Best Practices for Handling Exceptions.

http://msdn.microsoft.com/zh-CN/library/system.applicationexception.aspx


认为无用的ApplicationException是反对ApplicationException的有力且至关重要的论据。

结果:请勿使用。从Exception派生。


该框架的作者自己认为ApplicationException一文不值:

https://web.archive.org/web/20190904221653/https://blogs.msdn.microsoft.com/kcwalina/2006/06/23/applicationexception-considered-useless/

在这里进行了很好的跟进:

https://web.archive.org/web/20190828075736/https://blogs.msdn.microsoft.com/kcwalina/2006/07/05/choosing-the-right-type-of-exception-to-throw/

如有疑问,我遵循他们的书《框架设计指南》。

博客文章的主题将在此处进一步讨论。

rp


我曾经做过:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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,但是由于很少有不遵守ApplicationException模式的类,因此效果很好。


推荐阅读

    linux命令如何创建与?

    linux命令如何创建与?,名字,文件,命令,名称,系统,密码,首次,文件名,终端,文

    linux下创建网络命令?

    linux下创建网络命令?,网络,地址,工作,系统,管理,命令,名字,最新,项目,设备,l

    linux命令创建项目组?

    linux命令创建项目组?,管理,密码,项目,命令,系统,位置,文件,用户组,用户,文

    linux的创建目录命令?

    linux的创建目录命令?,名字,地址,位置,密码,软件,系统,命令,目录,文件夹,文

    linux创建端口命令?

    linux创建端口命令?,系统,网络,服务,通讯,检测,工具,端口,电脑,命令,以下,Lin

    linux创建内容的命令?

    linux创建内容的命令?,名字,文件,命令,密码,时间,系统,文件名,终端,目录,文

    linux下文件创建命令?

    linux下文件创建命令?,名字,名称,首次,命令,文件,系统,密码,文件名,文件夹,

    linux创建vp命令?

    linux创建vp命令?,系统,工作,基础,设备,地址,命令,目录,环境,信息,工具,linux

    linux命令创建文件加?

    linux命令创建文件加?,名字,管理,系统,名称,密码,首次,命令,文件,文件夹,位

    linux按命令创建磁盘?

    linux按命令创建磁盘?,系统,信息,业务,号码,数据,情况,电脑,分区,较大,工具,

    linux命令中创建文本?

    linux命令中创建文本?,系统,时间,文件,终端,名字,名称,发行,命令,文件夹,文

    linux常用命令创建?

    linux常用命令创建?,地址,系统,工作,时间,命令,管理,文件,目录,路径,控制台,l

    文件创建linux命令?

    文件创建linux命令?,名字,时间,名称,系统,首次,文件,命令,密码,文件名,目录,L

    linux创建软链接命令?

    linux创建软链接命令?,工作,地址,位置,系统,信息,管理,服务,名字,链接,文件,

    linux创建数组命令?

    linux创建数组命令?,地址,工作,系统,信息,命令,代码,目录,情况,标准,文件,Lin

    linux创建dic命令?

    linux创建dic命令?,软件,系统,电脑,下来,中心,词典,分级,基础,权威,网络,如何

    创建空文件linux命令?

    创建空文件linux命令?,名字,系统,密码,命令,文件,标准,首次,名称,时间,单位,l

    linux创建用户命令是?

    linux创建用户命令是?,系统,密码,用户,软件,联系方式,用户名,电脑,命令,账

    linux自己创建命令?

    linux自己创建命令?,名字,名称,密码,系统,首次,文件夹,命令,文件,位置,目录,l

    linux如何创建命令?

    linux如何创建命令?,工作,系统,名字,命令,首次,名称,地址,基础,密码,信息,lin