Exception
是所有异常的基本类型,因此非常不确定。您永远不要抛出此异常,因为它根本不包含任何有用的信息。调用代码捕获异常不会使故意抛出的异常(从您的逻辑)与其他完全不希望的系统异常,并指出真正的错误。
相同的原因也适用于SystemException
。如果查看派生类型的列表,则可以看到大量其他语义非常不同的异常。
NullReferenceException
并且IndexOutOfRangeException
是另一种。现在这些都是非常特殊的例外,因此抛出它们可能很好。但是,您仍然不希望抛出这些错误,因为它们通常意味着您的逻辑中存在一些实际错误。例如,空引用异常意味着您正在尝试访问的对象的成员null
。如果您的代码有这种可能,那么您应该始终显式检查null
并抛出一个更有用的异常(例如ArgumentNullException
)。同样,IndexOutOfRangeException
当您访问无效索引(在数组上,而不是列表上)时,s会发生。您应该始终确保首先不要这样做,并首先检查例如数组的边界。
还有其他一些例外,例如InvalidCastException
或DivideByZeroException
,这两个例外是由于代码中的特定错误而抛出的,通常意味着您做错了什么,或者您没有先检查某些无效值。通过从代码中有意识地抛出它们,您使调用代码更难确定是由于代码中的某些错误而抛出它们,还是仅仅因为您决定将它们重用于实现中。
当然,这些规则也有一些例外(哈)。如果要构建的东西可能会导致与现有异常完全匹配的异常,则可以随意使用它,尤其是当您尝试匹配某些内置行为时。只需确保选择一个非常特定的异常类型即可。
但是,通常,除非找到满足您需求的(特定)异常,否则应始终考虑为特定的预期异常创建自己的异常类型。尤其是在编写库代码时,这对于分隔异常源非常有用。