我怎么能改变' DivideByZeroException '从抛出到处理
本文关键字:处理 DivideByZeroException 能改变 | 更新日期: 2023-09-27 18:18:33
我想给int
一个类似于float
的行为,即使其能够除以0 但我希望它返回0。
此外,我想重载/
操作符为int
返回一个浮点数(我知道怎么做,但只提到完整性)。
我不想每次除法都检查分母是否为0;我也宁愿不等待异常被抛出,因为异常是缓慢的。
理想情况下,我想编辑异常的抛出尽可能接近"根"(系统的最低级别(CLR?)检测int
除以零)。是否有任何代码,我可以编辑像System
或其他地方?
编辑:
整个想法是(理想情况下)使用一个固定精度的浮点数。由于这种类型的当前实现在计算上很昂贵,而且有些不完整,使用int似乎是更好的主意,但要注意处理除法的无限结果。
因此,需要拦截EXCEPTION_INT_DIVIDE_BY_ZERO,并以某种方式处理它,使其被忽略,并返回int范围内的"奇数"值。
正如其他人所说,你不能那样做。你无法重新定义数学。你能得到的最好的解决方案就是有一个扩展方法。比如:
public static int SafeDivision(this int nom, int denom)
{
return denom != 0 ? nom/denom : 0;
}
你可以这样使用:
Console.WriteLine(10.SafeDivision(0)); // prints 0
Console.WriteLine(10.SafeDivision(2)); // prints 5
使用起来有点繁琐…
或者就像@MikeNakis在他的回答中建议的那样,你可以用你自己的逻辑创建你自己的结构。
int
不能这样做。
在System
或其他任何地方都没有代码可以编辑来实现这种类型的任何东西。
struct Integer
,它将封装int
,然后为它定义重载操作符,它将以所有你想要的方式处理所有的算术。你甚至可以让它在每次检测和防止除零时播放伦纳德·科恩的哈利路亚 mp3。
您将必须检查每次除法的分母是否为零。这将为您节省抛出异常的开销,而抛出异常的开销可能要高出数万倍。