C++ Design вопрос попробуйте поймать

У меня есть следующий код, в котором конструктор 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 ответа

Решение

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

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

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

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

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

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

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

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;
    }
}
Другие вопросы по тегам