【问题标题】:Why Ternary operation failure not cought in try catch为什么三元操作失败没有被try catch捕获
【发布时间】:2018-06-08 07:38:23
【问题描述】:

我指的是代码here。然后我将其修改如下,以捕捉失败。但是代码在没有捕获异常的情况下失败。如何处理(捕获)这种故障?

#include <iostream>
#include <exception>
using namespace std;

int main()
{
int test = 0;
cout << "test set to 0" << endl;
try {
    cout << (test ? "A String" : 0) << endl;
} catch(...) {
    cout << "Exception" << endl;
}
cout << "Test done" << endl;

return 0;
}

【问题讨论】:

  • 常见的类型是指针,解引用空指针会导致未定义的行为而不是异常。如果它崩溃了,那是因为另一个较低级别的“异常”,而不是 C++ 异常。

标签: c++ exception try-catch ternary-operator


【解决方案1】:

你的代码没有抛出任何异常,"A String" 的类型是const char*,所以是一个指针,而0 可以计算为NULL,也是一个指针,这意味着test ? "A String" : 0 返回const char*,没有错误。

如果你的代码有错误,我认为你不知道异常是如何工作的 test ? std::string{"A String"} : nullptr,该错误将是编译时错误,而不是异常,因为编译器将无法为这两种类型找到通用类型。

【讨论】:

    【解决方案2】:

    C++ 与大多数其他语言不同,具有未定义行为 的概念。这意味着无效操作不会导致异常,但会导致崩溃、数据损坏或其他任何事情。 C++ 中的异常 是代码明确地throws 和catches。您的代码中不是这种情况。

    (test ? "A String" : 0) 的结果是const char *。所以0 被转换为const char *,即一个NULL 指针。标准库有一个 overload 代表 operator &lt;&lt;,它期望 const char * 是一个非 NULL C 字符串。

    也就是说,operator &lt;&lt; 根本不检查输入参数是否为 NULL。并且延迟 NULL 指针是未定义的行为。在大多数系统上,它会导致操作系统级别的分段错误和程序终止。

    为了完整起见,在 MSVC 中,您可以使用 /EHa 编译以将 SEH 异常视为 C++ 异常,然后 catch(...) 也会捕获这些异常。但不要使用此功能,因为它可能导致资源泄漏和不可移植、不可维护的代码。

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 2013-05-02
      • 1970-01-01
      • 2010-10-16
      • 2012-05-05
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多