将std :: runtime_error捕获为std :: exception时出错

时间:2010-09-23 13:32:28

标签: c++ exception try-catch

我们在try catch和std :: runtime_error中遇到了一个有趣的问题。 有人可以向我解释为什么这会返回“未知错误”作为输出? 非常感谢你帮助我!

#include "stdafx.h"
#include <iostream>
#include <stdexcept>

int magicCode()
{
    throw std::runtime_error("FunnyError");
}

int funnyCatch()
{
    try{
        magicCode();
    } catch (std::exception& e) {
        throw e;
    }

}

int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
        funnyCatch();
    }
    catch (std::exception& e)
    {
        std::cout << e.what();
    }
 return 0;
}

2 个答案:

答案 0 :(得分:19)

问题出在这条线上。因为带有表达式的throw使用该表达式的静态类型来确定抛出的异常,所以这会对构造新std::exception对象的异常对象进行切片,只复制std::runtime_error的基础对象部分e是对。

的引用
throw e;

要重新抛出捕获的异常,应始终使用不带表达式的throw。

throw;

答案 1 :(得分:0)

我找到了对这个问题的完美回应:

  

C ++明确区分了引用和值复制。使用

catch (const std::exception& e) 
  

通过引用而不是值来捕获。

给出原始回应者here

的投票