为什么三元操作失败不咳嗽

Why Ternary operation failure not cought in try catch

本文关键字:失败 操作 三元 为什么      更新时间:2023-10-16

我在这里指的是代码。然后我按如下方式修改它,以捕获故障。但是代码失败而没有捕获异常。如何处理(捕获(此故障?

#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;
}

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

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

与大多数其他语言不同,C++具有未定义行为的概念。这意味着无效操作不会导致异常,但会导致崩溃、数据损坏或其他任何内容。C++ 中的异常是代码显式throws 和catches 的内容。在您的代码中并非如此。

(test ? "A String" : 0)的结果是const char *.所以0被转换为const char *,即一个空指针。标准库对operator <<有一个重载,该重载const char *期望为非 NULL C 字符串。

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

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