Подтвердить что ты не робот

Как получить сообщение об исключении catch-all

Если я хочу писать полезную информацию в файл всякий раз, когда я поймал исключение catch-all, как это сделать?

try
{
   //call dll from other company
}
catch(...)
{
   //how to write info to file here???????
}
4b9b3361

Ответ 1

Вы не можете получить информацию из блока catch. Вот почему код обычно обрабатывает такие исключения:

try
{
    // do stuff that may throw or fail
}
catch(const std::runtime_error& re)
{
    // speciffic handling for runtime_error
    std::cerr << "Runtime error: " << re.what() << std::endl;
}
catch(const std::exception& ex)
{
    // speciffic handling for all exceptions extending std::exception, except
    // std::runtime_error which is handled explicitly
    std::cerr << "Error occurred: " << ex.what() << std::endl;
}
catch(...)
{
    // catch any other errors (that we have no information about)
    std::cerr << "Unknown failure occurred. Possible memory corruption" << std::endl;
}

Ответ 2

Исключенное исключение доступно функцией std:: current_exception(), которая определена в <exception> . Это было введено в С++ 11.

std::exception_ptr current_exception();

Однако std:: exception_ptr - это тип, определенный реализацией, поэтому вы никак не можете добраться до деталей. typeid(current_exception()).name() сообщает exception_ptr, а не содержащее исключение. Итак, единственное, что вы можете сделать с этим: std:: rethrow_exception(). (Кажется, что эти функции стандартизируют перехват и переброс по потокам.)

Ответ 3

Нет никакого способа узнать что-либо о конкретном исключении в обработчике catch-all. Лучше всего, если вы можете поймать исключение базового класса, например std:: exception, если это вообще возможно.

Ответ 4

Вы не можете получить никаких подробностей. Весь смысл catch(...) заключается в том, чтобы иметь такой "я не знаю, что может случиться, поэтому поймайте все, что бросается". Вы обычно размещаете catch(...) после catch 'es для известных типов исключений.

Ответ 5

Я думаю, он хочет сделать так, что произошла ошибка, но конкретно не нужна точная ошибка (в этом случае он написал свой собственный текст ошибки).

Ссылка DumbCoder, опубликованная выше, содержит руководство, которое поможет вам получить то, что вы пытаетесь достичь.