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;
}
}