Как зарегистрировать исключение c ++ - PullRequest
1 голос
/ 22 января 2010

Знаете ли вы, как я могу зарегистрировать исключение?сейчас выводится сообщение в операторе catch, но я не могу понять, почему ins Mant.Gere () вызывается подозрительно

try{
    Manager.Gere(&par,&Acc, coman, comando, RunComando, log, &parti, comandosS, RunComandosSuper,true);
}
catch (...)
{
    log("ERROR ENTER GERE*****");
}


Perif::Gere(CString *par, CString *Acc, HANDLE coman, HANDLE comando, HANDLE RunComando, Log &log, CString *parti, HANDLE comandosS, HANDLE RunComandosSuper,bool first)
{
    log->LogD("Perif :: Gere Enter****** "); //It doesnt get printed

}

Ответы [ 4 ]

2 голосов
/ 22 января 2010

API с хорошим поведением должен генерировать только объекты типов, полученных из std::exception. Если это так, то исключение будет иметь функцию-член const char *what(), содержащую сообщение, которое, мы надеемся, опишет ошибку. Так что вы можете попробовать это и надеяться, что это поможет:

try {
    Manage.Gere(...);
} catch (const std::exception &e) {
    log(e.what());
} catch (...) {
    log("Manage.Gere threw unknown exception");
}

Если он выдает тип, который не является std::exception, то вам нужно будет просмотреть документацию и / или исходный код функции, чтобы увидеть, что может пойти не так, и какие типы он выдает. Если ничего из этого не доступно, я буду искать лучшую библиотеку.

0 голосов
/ 28 июля 2011

Вы также можете использовать мой инструмент в качестве внешнего отладчика, который перехватывает исключения C ++ и автоматически создает файлы мини-дампов для автономной отладки. Подробнее см. http://alax.info/blog/1211.

Хорошо, что для этого вам не нужен какой-либо код, или вы можете даже отладить приложение, для которого у вас нет кода, или вы не можете перестроить его по любой причине. Файл дампа получит вам стеки и информацию, и приложение сможет продолжить выполнение.

0 голосов
/ 22 января 2010

Как и предполагали другие, RTFM - действительно ответ. Тем не менее, я обнаружил, что ленивые программисты часто пишут такой код:

if ( something ) {
   throw "Something has happened!";
}

, поэтому всегда стоит пытаться поймать оба const char * и std :: string:

try {
   // stuff
}
catch( const char * s ) {
    cerr << s << endl;
}
catch( const std::string & s ) {
    cerr << s << endl;
}
// other catches here
0 голосов
/ 22 января 2010

Первое, что вам нужно, это найти, какие исключения Manage.Gere может выдать.
Затем catch они особенно похожи на catch(FirstExceptionGereThrows &exc), и когда вы поймаете все возможные исключения, вы узнаете, что происходит с ошибкой в ​​Manage.Gere.

catch(FirstException &exc){
   log << "Failed because FirstException\n";
}catch(SecondException &exc){
   log << "Failed because SecondException\n";
}

После, и, если вам повезет, исключения, выданные Manage.Gere, могут включать некоторую дополнительную информацию о сбое, которую вы также можете зарегистрировать.

catch(FirstException &exc){
   log << "Failed because FirstException: " << exc.what() << "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...