为什么 catch 不处理此错误C++
Why is catch not handling this error C++
当我在linux机器中运行它时,我希望catch块能够捕获异常。而我得到了一个分段错误。这是为什么呢?它不应该打印"捕获异常">
void handle_eptr(std::exception_ptr eptr) // passing by value is ok
{
try {
if (eptr) {
std::rethrow_exception(eptr);
}
} catch(const std::exception& e) {
std::cout << "Caught exception "" << e.what() << ""n";
}
}
int main()
{
char *c =(char*) 0x10;
std::exception_ptr eptr;
try {
std::string s = c;
} catch(...) {
std::cout<< "Caught exception";
//eptr = std::current_exception(); // capture
}
// handle_eptr(eptr);
std::cout << "Normal Exit";
}
给定
char *c =(char*) 0x10;
以下行会导致未定义的行为。
std::string s = c;
之后的程序行为可以是任何东西。在那之后试图理解程序的行为是没有意义的。
有关未定义行为的更多信息,请参阅未定义、未指定和实现定义的行为。
您正在尝试初始化std::string with
指向几乎肯定不适合您的程序的内存的*char
。您得到一个分段错误,这不是C++异常,而是系统异常。C++ try.. catch
块仅捕获C++异常。
您正在使用0x10初始化std::string
,这指向哪里?您拥有的是未定义的行为,幸运的是,它被捕获了分段错误。 C++ 不需要为此类未定义的行为引发异常。
分段错误不会导致引发异常。 这就是为什么什么都没有被抓住的原因。
异常由throw
语句引发。随机编码错误可能会导致意外引发异常,但这不是必需的,也不常见。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'