在checked块中调用的方法中没有溢出异常

时间:2016-09-09 10:18:10

标签: c# overflow

checked block用于确保是否发生溢出,抛出异常。例如,

以下代码抛出溢出异常,这很好。

checked
{
  int a = 123456;
  int b = 123456;
  Console.WriteLine(a * b);
}

但是如果我在被检查的块中调用一个方法,并且该方法依次具有抛出溢出异常的代码,则被检查的块似乎没有检测到它。是否也可以检测到这些。

checked
{
  int a = 123456;
  int b = 123456;
  Console.WriteLine(Mul(a, b));
}

public int Mul(int a, int b)
{
  return a * b;
}

1 个答案:

答案 0 :(得分:2)

此博客文章对此主题提供了一些解释:

https://blogs.msdn.microsoft.com/oldnewthing/20140815-00/?p=233

简而言之:在编译时检测是否以已检查或未检查模式执行语句,而不是在运行时检测到。如果您的程序流离开包含函数方法调用的已检查块,则检查/未检查状态特定于函数本身。

可以从已检查和未检查的代码中调用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;
   }
}