访问 try-catch 块外部的变量
Access variable outside try-catch block
我有以下代码:
class ClassA
{
public:
ClassA(std::string str);
std::string GetSomething();
};
int main()
{
std::string s = "";
try
{
ClassA a = ClassA(s);
}
catch(...)
{
//Do something
exit(1);
}
std::string result = a.GetSomething();
//Some large amount of code using 'a' out there.
}
我希望最后一行可以访问a
变量。鉴于 ClassA 没有默认构造函数ClassA()
并且我不想使用指针,我如何实现这一目标?是将默认构造函数添加到ClassA
的唯一方法吗?
你不能或不应该。相反,您可以在try
块中使用它,如下所示:
try
{
ClassA a = ClassA(s);
std::string result = a.GetSomething();
}
catch(...)
{
//Do something
exit(1);
}
原因是,由于a
在引用对象之后的try
块之后超出了范围,这是未定义的行为(如果您有指向它所在位置的指针(。
如果您关心a.GetSomething
或作业throw
,您可以对此进行try-catch
:
try
{
ClassA a = ClassA(s);
try {
std::string result = a.GetSomething();
}
catch(...) {
// handle exceptions not from the constructor
}
}
catch(...)
{
//Do something only for exception from the constructor
exit(1);
}
您可以使用
某种optional
或仅使用std::unique_ptr
。
int main()
{
std::string s = "";
std::unique_ptr<ClassA> pa;
try
{
pa.reset(new ClassA(s));
}
catch
{
//Do something
exit(1);
}
ClassA& a = *pa; // safe because of the exit(1) in catch() block
std::string result = a.GetSomething();
//Some large amount of code using 'a' out there.
}
当然,只是扩展try
块以包括a
的使用是最简单的解决方案。
此外,如果您真的打算在失败时exit(1)
或以其他方式中止程序,那么根本不要在这里放置try
块。异常将向上传播,如果未捕获,则会中止程序。
一种替代方法是使用 std::optional
.这与使用指针的概念相同,但它使用自动分配,因此不太可能创建内存泄漏。这目前处于实验状态;如果您的编译器没有std::experimental::optional
,则可以改用boost::optional
:
#include <experimental/optional>
using std::experimental::optional;
using std::experimental::in_place;
// ...
optional<ClassA> a;
try
{
a = optional<ClassA>(in_place, s);
}
catch(...)
{
// display message or something
}
std::string result;
if ( a )
result = a->GetSomething();
我想重申一下,这有点意大利面风格,最好以不同的方式设计代码,这样您就不会不断测试构造是成功还是失败。
这要求ClassA
可移动或可复制。in_place
是一个特殊的参数,它为其余参数调用一个完美的转发构造函数。如果没有in_place
,您只能给出一个实际的ClassA
作为构造函数参数,它不考虑隐式转换为ClassA
。 (这就是optional
避免复制构造和从相同类型的对象进行列表初始化之间的歧义的方式(。
相关文章:
- 在类函数中初始化外部作用域变量
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 同时具有"外部"和"内联"说明符的变量
- 访问 PlatformIO 中的外部环境变量
- 如何在函数外部访问函数中局部变量的值?
- 堆栈/帧指针作为外部变量
- 使用外部文件中的变量进行视觉C++
- 内联函数/变量的外部链接
- 当使用lambda进行变量的复杂初始化时,如何处理从内部抛出的lambda外部异常
- const_cast const 方法中的"this"将"this"分配给外部变量?
- 全局外部指针变量在 DLL 中不可见
- 在没有外部文件的情况下在应用会话之间保存变量
- 外部变量的初始化
- 全局变量的循环依赖性与外部说明符
- 如何在命名空间中初始化外部变量
- 声明类指针变量外部班级
- 在 VC++ 中访问一个文件中声明的变量.(外部关键字用法)
- 为什么 cout 不打印变量"C"外部?
- 全局变量外部声明后的线程专用指令
- c++变量外部声明