2010-06-28 4 views
18

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

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

Какое сообщение вы хотели бы выбрали вне исключения? Что делать, если объект брошен - это 'int'? Когда вы 'catch (...)', вы не знаете, что обнаруженное исключение будет иметь * сообщение *. – jalf

+0

Этот вопрос дал мне странную мысль (это не сработает, но было бы забавно, если бы это было так): template catch (const T & ex) {...} Я не думаю, что это может сработать с тех пор исключения - это скорее механизм выполнения ... или не так ли? Механизмы разворачивания стека, связанные с выбросом исключения и ветвлением в правильный блок catch, кажутся мне волшебными. Возможно, правильный блок catch для ветки до сих пор определяется во время компиляции, что объясняет одну из причин, почему так опасно бросать границы модулей. – stinky472

ответ

43

Вы не можете получить информацию из блока 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; 
} 
6

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

1

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

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

3

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

8

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

std::exception_ptr current_exception(); 

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