我在 .NET/C# 建议的异常处理原则 中描述了如何 catch
异常以及重新 throw
。然而何时应该 throw
异常,以及应该 throw
什么异常呢?
究竟是谁错了?
代码中从上到下从里到外都是在执行一个个的包含某种目的的代码,我们将其称之为“任务”。当需要完成某项任务时,任务的完成情况只有两种结果:
- 成功完成
- 失败
异常处理机制就是处理上面的第 2 种情况。这里我们不谈论错误码系统,那么,异常便应该在任务执行失败时抛出异常。
抛出异常后,报告错误只是手段,真正要做的是帮助开发者修复错误。于是,第一个要做的就是区分到底——谁错了!
- 任务的使用者用错了
- 任务的执行代码写错了
- 任务执行时所在的环境不符合预期
简单说来,就是:使用错误,实现错误、环境错误。
让我们把异常归类到这些错误中
本文的重点在于指导我们何时应该抛出什么异常,也就是说——我们的角色是——任务的编写者。那么,编写者有责任编写出一段没有错误的代码。这就说明——永远不应该抛出表示自己写错了的异常。
那么,我们对常见的异常进行分类。
使用错误
ArgumentException
表示参数使用错了
ArgumentNullException
表示参数不应该传入null
ArgumentOutOfRangeException
表示参数中的序号超出了范围InvalidEnumArgumentException
表示参数中的枚举值不正确
InvalidOperationException
表示当前状态下不允许进行此操作(也就是说存在着允许进行此操作的另一种状态)
ObjectDisposedException
表示对象已经Dispose
过了,不能再使用了
NotSupportedException
表示不支持进行此操作(这是在说不要再试图对这种类型的对象调用此方法了,不支持)
PlatformNotSupportedException
表示在此平台下不支持(如果程序跨平台的话)