Saa*_*med 1 c++ oop exception try-catch
假设我在 try 块内创建了一个对象,因为我想捕获从它的构造函数抛出的异常,那么我如何能够在该块之外使用该对象?
//Inputs given to t5 can throw an exception from the constructor.
try {
Time t5(23, 59, 59);
}
catch (invalid_argument& e) {
cerr << "\n\nException while initializing t5: " << e.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)
在引发异常的情况下,我可能不需要使用它,但在没有引发异常的情况下,我肯定会需要它,但在块内创建的对象在外部无法访问。我能想到的一种解决方案是在块之外创建对象,然后为其分配一个 R 值对象,我通过显式调用构造函数来创建该对象,如下所示:
Time t5;
try {
t5 = Time(23, 59, 59);
}
catch (invalid_argument& e) {
cerr << "\n\nException while initializing t5: " << e.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)
但这是在做不必要的事情,例如创建另一个对象只是为了尝试捕获异常。还有更好的方法吗?另外,从构造函数抛出异常是一种不好的编程习惯吗?PS:我看到有人问了类似的问题,但对于 C# 来说,给出的解决方案与我想出的解决方案相同,但我相信应该有更好的方法,正如我上面解释的那样。谢谢。
取决于默认构造函数的类型Time。如果它的构造函数只是将三个数字归零,那么您的解决方案就可以。
如果它的默认构造函数很昂贵(或者根本不存在),您可以将其放入std::optional:
std::optional<Time> t5;
try
{
t5.emplace(23, 59, 59);
}
// ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
925 次 |
| 最近记录: |