Ошибка при отлове std :: runtime_error как std :: exception - PullRequest
7 голосов
/ 23 сентября 2010

у нас есть забавная проблема с 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 ]

19 голосов
/ 23 сентября 2010

Проблема с этой линией. Поскольку throw с выражением использует статический тип этого выражения для определения сгенерированного исключения, это разделяет объект исключения, создающий новый объект std::exception, копирующий только часть базового объекта std::runtime_error, e которого является ссылкой к.

throw e;

Чтобы повторно выбросить пойманную исключительную ситуацию, вы всегда должны использовать throw без выражения.

throw;
0 голосов
/ 15 октября 2013

Я нашел идеальный ответ на эту проблему:

C ++ делает явное различие между ссылкой и копией значения. Используйте

catch (const std::exception& e) 

чтобы ловить по ссылке вместо значения.

Иди отдавай голоса для оригинального респондента здесь

...