如果我需要在我的应用程序中抛出一个异常,那么它是内置的.NET异常类可以使用吗?他们都公平吗?我应该什么时候得出自己的结论?

推荐答案

请参见Creating 和 Throwing Exceptions.

在抛出内置异常时,它说:

不要扔系统.例外,系统.系统例外,系统.NullReferenceException或System.IndexOutOfRangeException故意从您自己的源代码中删除.

不要抛出一般异常

If you throw a general exception type, such as Exception or SystemException in a library or framework, it forces consumers to catch all exceptions, including unknown exceptions that they do not know how to h和le.

相反,要么抛出框架中已经存在的更派生的类型,要么创建自己的从Exception派生的类型."

blog entry条也有一些有用的指导方针.

此外,FxCop代码分析将"不引发异常"列表定义为described here.它建议:

以下异常类型过于笼统,无法向用户提供足够的信息:

  • System.Exception
  • 系统应用程序异常
  • 系统系统例外

The following exception types are reserved 和 should be thrown only by the common language runtime:

  • 系统ExecutionEngineeException
  • 系统IndexOutOfRangeException
  • 系统NullReferenceException
  • 系统OutOfMemoryException

So in theory you can raise any other framework exception type, providing you clearly underst和 the intent of the exception as described by Microsoft (see MSDN documentation).

Note, these are "guidelines" 和 as some others have said, there is debate around 系统IndexOutOfRangeException (ie many developers throw this exception).

.net相关问答推荐

防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

如何正确使用“await using”语法?

如何为构造函数自定义 Visual Studio 的私有字段生成快捷方式?

C#6.0 字符串插值本地化

为什么发布和调试模式下的代码行为不同?

为什么 HashSet 比 HashSet 慢这么多?

.NET Core 是否支持异步控制台应用程序?

检测到包降级警告(dotnet core,vs 2017)

无法加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions,版本 = 1.1.0.0

使用带有大数据的 SqlCommand 异步方法的可怕性能

为什么具有可为空值的结构的 HashSet 非常慢?

等效于 C# 在 powershell 中的“使用”关键字?

没有科学记数法的双精度字符串转换

C# 6.0 是否适用于 .NET 4.0?

如何从标头中检索基本身份验证凭据?

如何从控制台应用程序中的 Task.WaitAll() 获取返回值?

IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

用 double 替换 int 时的 Visual Studio 长编译

MongoDB C# 驱动程序 - 忽略绑定字段

如何在 RabbitMQ 中设置重试次数?