Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Exception Handling_Class Design - Fatal编程技术网

C# 创建自定义异常还是使用内置异常?

C# 创建自定义异常还是使用内置异常?,c#,.net,exception-handling,class-design,C#,.net,Exception Handling,Class Design,目前,我正在编写一个客户端类,它利用DNS、套接字和SSL以及其他喜欢抛出异常的类。其他人将实现这个类,所以我想知道抛出异常的最佳实践是什么 我应该创建自己的自定义异常,让他们知道是我的类引发了异常,还是应该允许我调用的类和方法(DNS、套接字等)引发他们自己的异常?目前,代码有数百行,并且随着许多不同的方法调用而不断增长。在这种情况下抛出异常的最佳实践是什么?如果BCL包含的类已经传达了您想要的含义(例如,ArgumentNullException),请使用这些类 使用您自己的异常类保留特定于

目前,我正在编写一个客户端类,它利用DNS、套接字和SSL以及其他喜欢抛出异常的类。其他人将实现这个类,所以我想知道抛出异常的最佳实践是什么


我应该创建自己的自定义异常,让他们知道是我的类引发了异常,还是应该允许我调用的类和方法(DNS、套接字等)引发他们自己的异常?目前,代码有数百行,并且随着许多不同的方法调用而不断增长。在这种情况下抛出异常的最佳实践是什么?

如果BCL包含的类已经传达了您想要的含义(例如,
ArgumentNullException
),请使用这些类

使用您自己的异常类保留特定于API的内容


如果您觉得可以添加信息,请务必引发您自己的异常,但不要吞咽异常-将它们传播为您自己的内部异常。

如果您自己的异常添加信息,则可以引发异常,但除非存在安全问题,否则不要吞咽来自基础服务的异常


如果捕获一个异常并抛出一个新异常,请将旧异常分配给新异常的
InnerException
属性。通过这种方式,您可以根据需要嵌套尽可能多的异常,这将创建一个分层“视图”,以了解异常如何传播,这对调试非常有帮助。

这实际上取决于您的受众,即类的使用者

例如,如果您实际上正在包装许多不同的异常,那么创建自定义异常可能是一个好主意,这样可以简化使用者中的错误处理


如果确实创建自定义异常,请确保将原始异常包含到自定义异常的InnerException中,除非您明确有理由隐藏它。这将使使用您的类的人获得最多的可用信息,并且在您的类没有完全覆盖的异常返回时覆盖您。

您可以做的最糟糕的事情是抛出消息字符串中包含详细信息的ApplicationException。如果您发现自己需要这样做,那么是时候进行自定义异常了。

如果您想让任何人捕获并从您的异常中恢复,最好使用一个自定义异常类型的小层次结构,可能是按预期的可恢复程度组织的(例如,有一个异常类型指示“发生了意外的事情,但套接字可能仍然良好”,另一个表示“套接字状态不可信,但重新启动一个新的套接字连接可能会工作”,另一个表示“主机说你正在做的事情不起作用;除非你有理由相信某些事情,否则不要重试。”("已更改")引起异常的细节通常比违反后的条件的“捕获”代码更不重要。

如果您使用多个线程大量考虑聚合异常,而这是原生的.NET 4,则值得将其移植到.NET 3.5或更早的版本。系统扩展的特殊情况,但仍然足够具体,足以证明创建自己的扩展是正确的,然后从该异常继承,而不是从异常继承。