如何访问在 try 语句中初始化的对象
How to access objects that were initialized in a try statement
我是C++新手,想知道您是否可以执行以下操作,或者您是否有更好的方法。
我的数据库处理程序有一个自定义异常类:我在我的主目录中使用它,如下所示:
int main(int argc, char const ** argv){
try {
DatabaseHandler DGeneDB = DatabaseHandler("string/to/path");
}catch(DatabaseHandlerExceptions &msg) {
std::cerr << "Couldn't open Database" << std::endl;
std::cerr << msg.what();
return 1;
}
DGeneDB.foo() //Can't access this object since it was initialized in try statement
return 0;
}
我想对 DGeneDB 对象做十亿件事,但不想在 try 语句中完成所有这些操作。我只想捕获初始化期间抛出的构造函数异常。在 try 之外,我应该怎么做才能处理对象?我的意思是,如果它抛出异常,它将返回 1 并在到达另一个对象之前停止 main()。
您的Databasehandler
是否有open
方法或类似方法?如果没有,请创建一个并修改该构造函数,使其不再打开数据库连接(因此不会引发)。您的代码如下所示:
DatabaseHandler DGenDB;
try {
DGenDB.open(dbpaths.Dgene_db);
}
catch (DatabaseHandlerExceptions &msg) {
return 1;
}
注意:在原始代码中,您有如下所示的行:
DatabaseHandler DGeneDB = DatabaseHandler(dbpaths.Dgene_db);
这是一种在C++中初始化变量的不寻常方法。你可以写:
DatabaseHandler DGeneDB(dbpaths.Dgene_db);
您可以使用指针:
DatabaseHandler *DGeneDB;
try {
DGeneDB = new DatabaseHandler("string/to/path");
}catch(DatabaseHandlerExceptions &msg) {
// your error stuff here
}
DGeneDB->foo();
但不要忘记在使用后将其删除。
如果您有权访问 C++17(并且您的类型具有移动构造函数),则可以使用 std::optional :
std::optional<DatabaseHandler> database{};
try {
database = DatabaseHandler{arguments};
}
catch (const YourExceptionTypeHere &exception) {
// ...
return 1;
}
database->foo();
这样,您仍然可以根据需要初始化 try 块中的对象,而无需修改构造函数或诉诸堆内存分配(new/unique_ptr)。
如果指针喜欢 std::optional 的语法/性质困扰您,您也可以在初始化对象后将其移出 std::optional:
DatabaseHandler real_database{std::move(*database)};
real_database.foo();
相关文章:
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 如何在列表初始化中放置额外的语句?
- 在c++中的复制构造函数/一个声明语句中的初始化的延续中使用chain方法
- 返回语句中矢量初始化时出现编译错误
- (C++)for循环中的空初始语句是否保存所有编译器中变量的上一次初始化
- 初始化语句中临时 std::元组的开销
- 宏的 if 语句中的变量初始化
- 交换机案例语句中的初始化错误
- 为什么允许在开关语句中声明变量?但不是声明 初始化
- 如何在 switch 语句中正确初始化不同的派生类
- 指针变量在遇到断裂语句时重新初始化
- 在 switch 语句中初始化变量 (int32)
- 在switch语句中初始化时未定义的变量
- 用于初始化派生类型的泛型 switch 语句
- 如何访问在 try 语句中初始化的对象
- 我可以在"for"循环中有两个初始化语句吗?
- 初始化开关大小写语句中的数组
- 语句初始化属于哪个类别
- 根据if语句初始化对象
- 我可以通过一个语句初始化一个类的对象吗