为什么我们不抛出这些异常?

DonBoitnott:

我遇到了这个MSDN页面,其中指出:

不要故意从您自己的源代码中抛出ExceptionSystemExceptionNullReferenceExceptionIndexOutOfRangeException

不幸的是,它不会费心解释原因。我可以猜测出原因,但我希望有人对此主题更有权威。

前两个很明显,但是后两个看起来就像您想使用的(实际上,我有)。

此外,这些是唯一应避免的例外吗?如果还有其他人,它们是什么?为什么也要避免它们?

戳 :

Exception是所有异常的基本类型,因此非常不确定。您永远不要抛出此异常,因为它根本不包含任何有用的信息。调用代码捕获异常不会使故意抛出的异常(从您的逻辑中)与其他完全不需要的系统异常,并指出真正的错误。

相同的原因也适用于SystemException如果查看派生类型的列表,则可以看到大量其他语义非常不同的其他异常。

NullReferenceException并且IndexOutOfRangeException是另一种。现在这些都是非常具体的例外,因此抛出它们可能很好。但是,您仍然不希望抛出这些错误,因为它们通常意味着您的逻辑中存在一些实际错误。例如,空引用异常意味着您正在尝试访问的对象的成员null如果您的代码有这种可能,那么您应该始终显式检查null并抛出一个更有用的异常(例如ArgumentNullException)。同样,IndexOutOfRangeException当您访问无效索引(在数组上,而不是列表上)时,将出现s。您应该始终确保首先不要这样做,并首先检查例如数组的边界。

还有其他一些例外,例如InvalidCastExceptionDivideByZeroException,这两个例外是针对代码中的特定错误而抛出的,通常意味着您做错了事或没有首先检查某些无效值。通过从代码中有意识地抛出它们,您只是使调用代码更难确定是由于代码中的某些错误而抛出它们,还是仅仅因为您决定将它们重用于实现中。

当然,这些规则也有一些例外(哈)。如果要构建的东西可能会导致与现有异常完全匹配的异常,则可以随意使用它,尤其是当您尝试匹配某些内置行为时。只需确保选择一个非常特定的异常类型即可。

但是,通常,除非找到满足您需求的(特定)异常,否则应始终考虑为特定的预期异常创建自己的异常类型。特别是在编写库代码时,这对于分隔异常源非常有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章