2017-06-20 27 views
-3

当我在linux机器上运行这个时,我期望catch块捕获异常。而我得到了分段错误。为什么是这样 ?如果它不打印“被捕获的异常”为什么catch没有处理这个错误C++

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"; 
} 
+1

[什么例外](http://en.cppreference.com/w/cpp/string/basic_string/basic_string)? – LogicStuff

+0

如果不打印“捕获的异常” – Ram

+4

您的期望是非法的地址解引用将导致C++异常。事实并非如此。你已经触发了UB,UB可以做任何事情;包括抛出一个异常,打开一年的圣诞树上的灯光,重新格式化硬盘,... – pm100

回答

0

您正在初始化一个与0x10,那点?你有什么是未定义的行为,这是幸运的与分段错误捕捉。 C++不需要针对这种未定义的行为抛出异常。

分段错误不会引发异常。这就是为什么没有被捕获。

+0

@Ram编辑我的回答 – Curious

+0

分段故障是个例外。它只是不是C++异常,它是系统异常。 –

+0

@PetarVelev我认为它可以安全地假设我的答案是我的意思是一个C++异常。 – Curious

5

鉴于

char *c =(char*) 0x10; 

以下行导致不确定的行为。

std::string s = c; 

之后,你的程序的行为可以是任何东西。在那之后尝试理解程序的行为是毫无意义的。

有关未定义行为的更多信息,请参见Undefined, unspecified and implementation-defined behavior

+0

但是有一个赶上异常。我认为它应该打印出“捕捉异常”的信息并优雅地返回 – Ram

+3

@Ram没有任何异常可以被捕获。 *未定义的行为*不会引发异常 – UnholySheep

+1

@Ram,并不保证访问内存不会导致必须抛出异常。有些平台可能会,但那也是未定义的行为。 –

1

您正试图初始化std::string with a *char谁指向内存几乎肯定不适合您的程序。 你会得到一个不是C++异常的分段错误,它是系统异常。 C++ try.. catch块只捕获C++异常。

0

异常是由throw语句引发的。随机编码错误可能会导致意外抛出异常,但这不是必需的,也不常见。

相关问题