为什么 catch 不处理此错误C++

Why is catch not handling this error C++

本文关键字:错误 C++ 处理 catch 为什么      更新时间:2023-10-16

当我在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语句引发。随机编码错误可能会导致意外引发异常,但这不是必需的,也不常见。