C++ 为什么在泛型catch()中没有捕获到除零运算

C++ 为什么在泛型catch()中没有捕获到除零运算,c++,exception,exception-handling,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

我有以下代码,在运行时应该抛出一个除法为零的异常。似乎根本没有抓住例外情况。我使用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");
}
试试看
{
printf(“试块”);
对于(int i=0;i<10;i++)
{
printf(“%d\n”,1/i);
}       
}
捕获(…)
{
printf(“除零”);
}

你不能依赖被零除的行为;它是未定义的:

N4296第5/4节:

如果在表达式求值期间,结果不是 数学定义的或不在可表示值范围内的 其类型、行为未定义


如果您需要确保在尝试除以零时引发异常,则必须制作自己的包装器:

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

如果您想要通过抛出一个异常来处理被零除的可移植代码,那么您可以编写一个类来包装一个合适的数值类型,并在除法和修改操作之前进行检查,然后使用它来代替内置的数值类型。。。。C++库不提供这样的类型。实际上,它并不是特别有用——您只需在特定位置签入代码,就可以使用0执行除法或mod操作。

不,它不一定会抛出。如果是这样,那是因为未定义的行为,并且捕获它并继续进行,可能只会带来痛苦。除以零不是标准的C++异常。这只是一个示例,用于捕捉TIE块中的任何异常。