为什么除零没有陷入泛型catch()

时间:2015-03-25 14:00:57

标签: c++ exception exception-handling

我有以下代码,在运行时应该抛出除零异常。似乎根本没有抓住异常。我正在使用catch(...)来捕获try块中的任何异常。 catch(...)是一种很好的方法来捕获try块中的任何异常吗?

try
{
    printf("Try Block");
    for (int i = 0; i < 10; i++)
    {
        printf("%d\n", 1 / i);
    }       
}

catch (...)
{
    printf("Division by zero");
}

3 个答案:

答案 0 :(得分:2)

你不能依靠零除的行为;这是未定义的:

N4296§5/ 4:

  

如果在评估表达式期间,结果不是   在数学上定义或不在可表示值的范围内   它的类型,行为是未定义的。

答案 1 :(得分:0)

如果您需要确保在尝试除以零时抛出异常,则必须制作自己的包装器来执行此操作:

long double Divide(long double numerator, long double denominator)
{
  if (denominator == 0)
  {
    throw std::range_error("Division by zero!");
  }
  return numerator / denominator;
}

答案 2 :(得分:0)

如果你想要通过抛出异常来处理除以零的可移植代码,那么你可以编写一个包装合适数字类型的类并在除法和修改操作之前进行检查,并使用它而不是内置数值类型... C ++库不提供这样的类型。实际上,它并不是特别有用 - 你可以在特定的地方检查你的代码,这些地方可能用0进行除法或mod运算。