c++ 从catch块重新抛出异常时,丢失异常类型

今天我在catch块中发现了一个bug:

catch (const exception& e){
    // do something
    // throw e; <-- bug!
    throw;    // <-- right thing to do
}

基本上如果我重新抛出异常e,我得到一个新的std :: exception重构,实际上,来自what()方法的消息是默认的std :: string,而不是我自定义的内置消息.

有什么解释?我以为扔了只是抛出ExceptionJustCaught的一个简写.

最佳答案
异常对象有点特别.他们被建造在记忆中的一个特殊的地方,他们的一生由他们被抓住的拦截块决定.

如果你说throw e ;, ;, ;, ;, ;, ;, ;, at catch catch catch throw throw throw throw throw throw throw throw throw throw throw throw throw throw throw throw throw throw thus thus thus thus thus:::::::::::动态类型通常比std :: exception更多派生,您最终将对象的派生部分进行切片.

相反,扔;是一个特殊的声明,重新启动原始异常,使其不再被捕获,并且其生命周期不再在块的末尾结束.实际上,如果用非常量引用来捕捉,那么可以继续修改异常对象并进行重新抛出,从而将状态更改为更低的catch块.但是请记住,重新抛出不同于抛出新的异常!

转载注明原文:c++ 从catch块重新抛出异常时,丢失异常类型 - 代码日志