вопрос проектирования c ++ попробуйте поймать - PullRequest
2 голосов
/ 25 февраля 2011

У меня есть следующий код, в котором конструктор dbh может выдать исключение. Вопрос, который у меня есть, dbh объявлен внутри блока try. Будет ли это доступно после улова? Если да, есть ли другие исключения, где разрешение области отличается от {}? Если нет, то какой дизайн лучше всего подходит?

status func(const char* field, char** value)
{
    try {
        dbhandler<recType> dbh(("dbName"),("table"));
    }
    catch (std::runtime_error &e) {
        LOG_ERR << e.what() << endl ;
        return false;
    }
    catch (...) {
        LOG_ERR << "Unknown exception" << endl ;
        return false;
    }

    rc = dbh.start("key",field, val);
    return rc;
}

Ответы [ 2 ]

8 голосов
/ 25 февраля 2011

Будет ли он доступен после улова?

Нет.Он будет уничтожен в конце блока, в котором он объявлен, как и любая другая локальная переменная.

try {
    dbhandler<recType> dbh(("dbName"),("table")); 
}   // dbh.~dbhandler<recType>() is called to destroy dbh

Какая лучшая альтернатива для дизайна?

Объявите dbh за пределами блока try или переместите весь код, который его использует, в блок try.Какой из них наиболее целесообразен, зависит от вашего конкретного варианта использования.

На несколько связанном примечании, если вы catch (...), вам следует либо выбросить исключение, либо закрыть приложение: вы не представляете, что это за исключение.обрабатываются, и в целом вы не знаете, безопасно ли продолжать выполнение.

2 голосов
/ 25 февраля 2011

Согласно вашему коду функции, имеет смысл написать его так:

status func(const char* field, char** value)
{
    try {
        dbhandler<recType> dbh(("dbName"),("table"));
        status rc = dbh.start("key",field, val);
        return rc;
    }
    catch (std::runtime_error &e) {
        LOG_ERR << e.what() << endl ;
        return false;
    }
    catch (...) {
        LOG_ERR << "Unknown exception" << endl ;
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...