为什么三元操作失败不能尝试捕获

时间:2018-06-08 07:38:23

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

我指的是代码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;
}

2 个答案:

答案 0 :(得分:5)

您的代码不会抛出任何异常,"A String"的类型为const char*,因此指针和0可以被评估为NULL,指针也是,这意味着test ? "A String" : 0返回const char*,没有错误。

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

答案 1 :(得分:2)

与其他大多数语言不同,C ++有 未定义行为 的概念。这意味着无效操作不会导致异常,而是导致崩溃,数据损坏或其他任何事情。 C ++中的异常是代码明确throwcatch的东西。你的代码中并非如此。

(test ? "A String" : 0)的结果是const char *。因此0转换为const char *,即NULL指针。标准库的operator <<overload,期望const char *为非NULL C字符串。

也就是说,operator <<根本不检查输入参数是否为NULL。并且引用NULL指针是未定义的行为。在大多数系统上,它将导致操作系统级别的分段故障和程序终止。

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