我有以下代码,其中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;
}
答案 0 :(得分:8)
捕获后是否可以使用?
没有。它将在声明它的块的末尾被销毁,就像任何其他局部变量一样。
try {
dbhandler<recType> dbh(("dbName"),("table"));
} // dbh.~dbhandler<recType>() is called to destroy dbh
最佳设计选择是什么?
在dbh
块之外声明try
或将使用它的所有代码移动到try
块中。哪一个最有意义取决于您的具体用例。
在一个有点相关的说明中,如果你catch (...)
,你应该重新抛出异常或终止应用程序:你不知道正在处理什么异常,一般你不知道继续是否安全执行。
答案 1 :(得分:2)
根据你的功能代码,写它是很有意义的:
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;
}
}