为什么三元操作失败不咳嗽
Why Ternary operation failure not cought in try catch
我在这里指的是代码。然后我按如下方式修改它,以捕获故障。但是代码失败而没有捕获异常。如何处理(捕获(此故障?
#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++ 中的异常是代码显式throw
s 和catch
es 的内容。在您的代码中并非如此。
(test ? "A String" : 0)
的结果是const char *
.所以0
被转换为const char *
,即一个空指针。标准库对operator <<
有一个重载,该重载const char *
期望为非 NULL C 字符串。
也就是说,operator <<
根本不检查输入参数的 NULL。引用 NULL 指针是未定义的行为。在大多数系统上,它会导致操作系统级别的分段错误和程序终止。
为了完整起见,在 MSVC 中,您可以使用/EHa
进行编译,以将 SEH 异常视为C++异常,然后catch(...)
也会捕获这些异常。但不要使用此功能,因为它可能导致资源泄漏和不可移植、不可维护的代码。
相关文章:
- 如果没有malloc,链表实现将失败
- 无法调用成员函数,尝试正确执行此操作仍然失败
- 元数据操作失败LNK2022错误 (8013118D):重复类型中的布局信息不一致 (选择设备参数):(0x020002
- 为什么三元操作失败不咳嗽
- LoadLibrary失败带有错误4250:此操作仅在应用程序容器的上下文中有效
- C/C++ 套接字:如果我在 IPv6 TCP 连接之前执行任何操作,则连接将失败
- 谷歌测试:如果测试失败,则执行其他操作
- X失败请求的错误:BadValue(整数参数超出操作范围)
- 如何在服务exe中添加失败操作
- OpenCL OpenGL 互操作上下文创建失败
- 什么会导致罕见的 lchown() 失败:不允许操作
- 当 std::fprintf(stderr,..) 失败时,操作是否不起作用,或者可以在失败之前写入一点
- 对于某些输入,使用逐位操作完成的2除法器的舍入幂失败
- 重载的*运算符在多个*操作后调用析构函数时失败
- 编译器错误-元数据操作失败
- 可能在刷新操作中写入文件失败
- Qt打开文本文件操作失败
- Allegro5 - openGL:失败请求的主要操作码:55 (X_CreateGC)
- 调试断言失败!使用指针运算的字符串操作
- 操作失败后,TransferClient不返回错误消息