【问题标题】:Why cannot catch c++ exceptions [duplicate]为什么不能捕获c ++异常[重复]
【发布时间】:2014-08-25 08:10:35
【问题描述】:

如果我在 c++ 中编写代码并抛出异常,我也可以捕获这些异常。示例;

int divide(int divison, int dividor)
{
    if (dividor == 0)
        throw DivideByZeroException();
    return divison / dividor;
}
void main()
{
    int a = 10,b=0;
    try
    {
        result = divide(a, b);
        cout << "result : " << result << endl;
    }
    catch (exception & e)
    {
        cout <<  e.what() << endl;
    }   
    cout << "Enter a key to exit" << endl;
    cin.get();
}

但是,如果我尝试直接捕获相同的异常程序崩溃。示例

void main()
{
    int a = 10,b=0;
    try
    {
        result = a / b;
        cout << "result : " << result << endl;
    }
    catch (exception & e)
    {
        cout << "Normal exception :" << e.what() << endl;
    }
    cout << "Enter a key to exit" << endl;
    cin.get();
}

为什么会发生这种情况?有没有办法在 c++ 中发生错误时阻止程序崩溃?

【问题讨论】:

标签: c++ exception crash


【解决方案1】:

在 C++ 中,除以 0 不会产生异常:行为是未定义的(在许多操作系统上,内核会向程序发送信号,如果你没有捕捉到它,程序就会终止)。

C++ 标准,第 5/4 节

如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。

您可以(应该)在进行除法之前检查您的输入:语言不会为您做这件事。 (有些数值库封装了原始类型,重载了操作符,并且会抛出异常)

【讨论】:

  • 是的,似乎不鼓励在程序中使用 try-catch。据我搜索,人们提出使用从函数返回 0 而不是抛出异常。我们可以说如果 c++ 代码有异常吗会崩溃,在大多数情况下,try catch 不会拯救我们。
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 2010-12-07
  • 2014-12-05
  • 2014-11-24
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多