C# 是否有任何理由抛出dividebyzero异常?

C# 是否有任何理由抛出dividebyzero异常?,c#,exception-handling,argumentnullexception,dividebyzeroexception,C#,Exception Handling,Argumentnullexception,Dividebyzeroexception,在任何情况下,抛出可以避免的错误是一个好主意吗 我特别想到的是dividebyzerotexception和ArgumentNullException 例如: double numerator = 10; double denominator = getDenominator(); if( denominator == 0 ){ throw new DivideByZeroException("You can't divide by Zero!"); } 有什么理由抛出这样的错误吗 注

在任何情况下,抛出可以避免的错误是一个好主意吗

我特别想到的是
dividebyzerotexception
ArgumentNullException

例如:

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

if( denominator == 0 ){
   throw new DivideByZeroException("You can't divide by Zero!");
}
有什么理由抛出这样的错误吗

注意:我不是说捕捉这些错误,而是要知道是否有足够的理由抛出这些错误

只是重申一下


我知道在我给出的示例中,处理错误可能会更好。也许这个问题应该重新措辞。是否有任何理由抛出这些错误中的一个,而不是在位置处理它

没有我能想到的。我只是反对它。异常可能会很昂贵,所以如果您可以防御它,那么就这样做,而不是抛出异常


至少这是我的高级开发人员告诉我的,当我在很多个月前尝试捕获一个dividebyzero异常时。

从资源的角度来看,抛出异常是一件昂贵的事情。您已经阻止了异常的发生,为什么要抛出异常呢?如果必须告诉用户,请使用一些消息传递机制。如果您需要自己了解,请记录它。

您应该只使用异常来处理异常情况

在这种情况下,零看起来是无效的用户输入。您应该检查是否存在无效的用户输入,并相应地进行处理,然后才能确定是否存在适当的异常


只要正确处理输入,就不应该发生
dividebyzeroception
。如果您在验证输入后仍收到一个
DivideByZeroException
,那么您就知道存在真正的问题(在这种情况下,异常是适当的)。

在开始处理数据之前,最好在函数顶部进行这些检查。而不是将它们(或任何其他方法抛出这些异常)放在方法的中间。

如果你在谈论直接与UI交互的代码,那么没有。我想不出你为什么想这样做。


但是,如果您正在构建一个由其他开发人员使用的类/对象,并且他们传入了明显愚蠢的数据,那么请在验证过程中抛出相应的错误。

NET运行时已经非常擅长抛出这些异常。它们还高度描述了什么是错误的,您不能向异常消息添加任何好的注释。“不能被零除”不会增加任何值


但是,您可以通过筛选客户端代码传递的值来避免这些异常。如果客户端代码传递了一个null,则需要参数名为ArgumentNullException的ArgumentException,如果客户端代码传递了一个容易被零除掉的值,则需要ArgumentNullException。

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

在理论上(以及实践中),识别和避免/消除错误案例比将其视为异常要好。但是,通过代码测试每种情况或路径并不总是可能的——在每种情况下也不可能控制输入


好的设计原则是让您的程序能够识别并优雅地处理异常情况。此外,最好向用户(最终是您自己)提供足够的信息来诊断错误,尤其是部署代码后可能发生的错误。因此,有时抛出异常(如所示)是有意义的,它是否会使您的应用程序代码更健壮、更易于诊断。

这样做绝对是有原因的,就像大多数抛出异常的问题一样,您必须将自己视为团队中的开发人员。您正在编写的内容可能是另一个系统的一部分,也可能是一个库或组件

如果您编写了一个数学库,并且有一个名为Divide(inta,intb)的函数对它们进行分割,如果其他人想使用您的方法并将其传递为零,那么您需要抛出一个异常,以便作为开发人员,他们知道自己搞砸了


如果不抛出异常,则会在代码中引入bug。如果我使用除法,并将值10和0放入,这将产生10/0,从而产生一个异常,唯一正确的答案是错误。如果您决定更改值以便不发生错误,或者返回0,这不是我所期望的-我假设我的除法工作正常,并且从未注意到问题。我可能会取0,然后在其他计算中使用它,不知道它是错误的答案,因为10/0不是0。

在您自己的代码中,我怀疑它是否有多大用处。但是,如果您编写的库将被其他人使用,则应使用异常作为将错误传递回使用库的代码的方法

“在该框架中,使用了例外情况 对于硬错误和逻辑错误 一开始,这可能很难 将异常处理作为 报告所有功能的方法 失败。然而,重要的是 设计一个应用程序的所有公共方法 报告方法失败的框架 正在引发异常。”


如果您正在编写一个BigInteger库,那么绝对应该抛出一个适当的
除以零的异常。如果你在写一个购物车库,那么……呃,可能不是

目前,我想不出一个抛出
NullReferenceException
的好理由。如果您正在创建一个API,其中的文档说明“HummingBirdFeeder.OpenSugarWaterDispenser的第一个参数(Dispenser Dispenser,int fl
Debug.Assert(dispenser != null);