在检查块中调用的方法中没有溢出异常
No overflow exception in a method called in checked block
checked 块用于确保是否发生溢出,是否抛出异常。例如,
下面的代码抛出溢出异常没问题。
checked
{
int a = 123456;
int b = 123456;
Console.WriteLine(a * b);
}
但是如果我在 checked 块中调用一个方法,而该方法又包含抛出溢出异常的代码,checked 块似乎没有检测到这一点。是否也可以检测到这些。
checked
{
int a = 123456;
int b = 123456;
Console.WriteLine(Mul(a, b));
}
public int Mul(int a, int b)
{
return a * b;
}
此博客 post 对此主题进行了一些解释:
https://devblogs.microsoft.com/oldnewthing/20140815-00/?p=233
简而言之:一条语句是以checked还是unchecked模式执行的,是在编译时检测到的,而不是在运行时检测到的。如果您的程序流离开包含函数方法调用的检查块,则 checked/unchecked 状态特定于函数本身。
可以从已检查和未检查的代码中调用 Mul
方法 - 像这样:
checked
{
int a = 123456;
int b = 123456;
Console.WriteLine(Mul(a, b));
}
unchecked
{
int a = 123456;
int b = 123456;
Console.WriteLine(Mul(a, b));
}
异常行为应该如何实现?是否抛出异常?
所以你必须在 Mul
方法中具体化,并在那里创建一个检查块。
public int Mul(int a, int b)
{
checked {
return a * b;
}
}
checked 块用于确保是否发生溢出,是否抛出异常。例如,
下面的代码抛出溢出异常没问题。
checked
{
int a = 123456;
int b = 123456;
Console.WriteLine(a * b);
}
但是如果我在 checked 块中调用一个方法,而该方法又包含抛出溢出异常的代码,checked 块似乎没有检测到这一点。是否也可以检测到这些。
checked
{
int a = 123456;
int b = 123456;
Console.WriteLine(Mul(a, b));
}
public int Mul(int a, int b)
{
return a * b;
}
此博客 post 对此主题进行了一些解释:
https://devblogs.microsoft.com/oldnewthing/20140815-00/?p=233
简而言之:一条语句是以checked还是unchecked模式执行的,是在编译时检测到的,而不是在运行时检测到的。如果您的程序流离开包含函数方法调用的检查块,则 checked/unchecked 状态特定于函数本身。
可以从已检查和未检查的代码中调用 Mul
方法 - 像这样:
checked
{
int a = 123456;
int b = 123456;
Console.WriteLine(Mul(a, b));
}
unchecked
{
int a = 123456;
int b = 123456;
Console.WriteLine(Mul(a, b));
}
异常行为应该如何实现?是否抛出异常?
所以你必须在 Mul
方法中具体化,并在那里创建一个检查块。
public int Mul(int a, int b)
{
checked {
return a * b;
}
}