我指的是代码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;
}
答案 0 :(得分:5)
您的代码不会抛出任何异常,"A String"
的类型为const char*
,因此指针和0
可以被评估为NULL
,指针也是,这意味着test ? "A String" : 0
返回const char*
,没有错误。
此外,如果您的代码出现类似错误,我认为您不知道异常是如何工作的
test ? std::string{"A String"} : nullptr
,该错误将是编译时错误,而不是异常,因为编译器将无法找到这两种类型的公共类型。
答案 1 :(得分:2)
与其他大多数语言不同,C ++有 未定义行为 的概念。这意味着无效操作不会导致异常,而是导致崩溃,数据损坏或其他任何事情。 C ++中的异常是代码明确throw
和catch
的东西。你的代码中并非如此。
(test ? "A String" : 0)
的结果是const char *
。因此0
转换为const char *
,即NULL指针。标准库的operator <<
为overload,期望const char *
为非NULL C字符串。
也就是说,operator <<
根本不检查输入参数是否为NULL。并且引用NULL指针是未定义的行为。在大多数系统上,它将导致操作系统级别的分段故障和程序终止。
为了完整性,在MSVC中,您可以使用/EHa
进行编译以将SEH异常视为C ++异常,然后catch(...)
也将捕获这些异常。但是不要使用此功能,因为它可能导致资源泄漏和不可移植的,无法维护的代码。