有没有理由抛出DivideByZeroException?

Arm*_*est 21 c# exception-handling argumentnullexception dividebyzeroexception

有什么情况throw可以避免可以避免的错误吗?

我正在考虑DivideByZeroExceptionArgumentNullException

例如:

double numerator = 10;
double denominator = getDenominator();

if( denominator == 0 ){
   throw new DivideByZeroException("You can't divide by Zero!");
}
Run Code Online (Sandbox Code Playgroud)

有没有理由抛出这样的错误?

注意:我不是在谈论捕捉这些错误,而是专门知道是否有充分理由抛弃这些错误.

只是重新评估:

我知道在我给你的例子中你可能会更好地处理错误.也许这个问题应该改写一下.是否有任何原因导致throw其中一个错误,而不是在位置处理它.

juh*_*arr 20

假设您编写了一个库来处理不适合Int64的大整数,那么您可能希望为您编写的除法算法抛出DivideByZeroException.

  • @Atomiton - 我之前确实做过这件事.如果你已经写了一个数学库,并且调用代码给你一个零分母,除了抛出异常之外你还能做什么呢?数学库不知道你要做什么.没有始终正确的方法来处理该位置的情况.只有调用代码才能拥有足够的全局视图来知道如何处理它.所以抛出异常. (6认同)

Han*_*ant 12

.NET运行时已经非常善于抛出这些异常.它们也高度描述了什么是错误的,你不能在异常消息中添加任何好的评论."你不能除以零"没有增加任何价值.

但是,您可以通过筛选客户端代码传递的值来避免许多这些异常.如果客户端代码传递null,则ArgumentNullException将带有参数名称,ArgumentException传递的东西可能会导致DivideByZero错误.


Nib*_*Pig 5

绝对有理由这样做,就像大多数例外抛出问题一样,你必须把你当作一个在团队中工作的开发人员.您正在撰写的内容可能是另一个系统的一部分,也可能是一个库或组件.

如果你编写了一个数学库,并且有一个被调用的函数Divide(int a, int b)来划分它们,如果其他人想要使用你的方法并传入零,那么你会想要抛出一个异常,这样他们作为一个开发人员就知道他们搞砸了.

如果不抛出异常,则会在代码中引入错误.如果我使用了divide方法,并将值10和0放入,这会产生10/0,从而产生异常,唯一正确的答案就是错误.如果您决定更改值以便不发生错误,或者返回0,那不是我所期望的 - 我认为我的部门工作完美,并且从未注意到问题.我可能会把那个0拿走并在其他计算中使用它,不知道这是错误的答案,因为10/0不是0.