Если я хочу писать полезную информацию в файл всякий раз, когда я поймал исключение catch-all, как это сделать?
try
{
//call dll from other company
}
catch(...)
{
//how to write info to file here???????
}
Если я хочу писать полезную информацию в файл всякий раз, когда я поймал исключение catch-all, как это сделать?
try
{
//call dll from other company
}
catch(...)
{
//how to write info to file here???????
}
Вы не можете получить информацию из блока 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;
}
Исключенное исключение доступно функцией std:: current_exception(), которая определена в <exception> . Это было введено в С++ 11.
std::exception_ptr current_exception();
Однако std:: exception_ptr - это тип, определенный реализацией, поэтому вы никак не можете добраться до деталей. typeid(current_exception()).name()
сообщает exception_ptr, а не содержащее исключение. Итак, единственное, что вы можете сделать с этим: std:: rethrow_exception(). (Кажется, что эти функции стандартизируют перехват и переброс по потокам.)
Нет никакого способа узнать что-либо о конкретном исключении в обработчике catch-all. Лучше всего, если вы можете поймать исключение базового класса, например std:: exception, если это вообще возможно.
Вы не можете получить никаких подробностей. Весь смысл catch(...)
заключается в том, чтобы иметь такой "я не знаю, что может случиться, поэтому поймайте все, что бросается". Вы обычно размещаете catch(...)
после catch
'es для известных типов исключений.
Я думаю, он хочет сделать так, что произошла ошибка, но конкретно не нужна точная ошибка (в этом случае он написал свой собственный текст ошибки).
Ссылка DumbCoder, опубликованная выше, содержит руководство, которое поможет вам получить то, что вы пытаетесь достичь.