如何使用在 try 块内部创建的对象?
How to use an object created inside a try block, outside of it?
假设我在 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;
}
在抛出异常的情况下,我可能不需要使用它,但在没有抛出异常的情况下,之后我肯定会需要它,但是在块中创建的对象不是'外面无法访问。
我能想到的一种解决方案是在块外部创建对象,然后为它分配一个 R 值对象,我通过显式调用构造函数创建它:
Time t5;
try {
t5 = Time(23, 59, 59);
}
catch (invalid_argument& e) {
cerr << "\n\nException while initializing t5: " << e.what() << endl;
}
但这是在做不必要的事情,比如创建另一个对象只是为了尝试捕获异常。
有没有更好的方法来做到这一点?另外,从构造函数中抛出异常是一种糟糕的编程习惯吗?
PS:我看到有人问了一个类似的问题,但对于 C#,而且给出的解决方案与我想出的相同,但我相信应该有更好的方法,正如我上面解释的那样。
谢谢。
取决于Time
具有哪种默认构造函数。如果它的构造函数只是将三个数字归零,那么你的解决方案就可以了。
如果它的默认构造函数很昂贵(或者根本不存在),你可以把它放到std::optional
:
std::optional<Time> t5;
try
{
t5.emplace(23, 59, 59);
}
// ...
不要以为我们真的可以在 try 块之外访问它。
解决问题的两种方法。
最好在 try 块中包含时间 t5 的用法。
利用std::optional
std::optional<Time> t5;
try
{
t5.emplace(23, 59, 59);
}
catch (invalid_argument& e) {
//exception message
}
if(t5)
{
//use t5
}
假设我在 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;
}
在抛出异常的情况下,我可能不需要使用它,但在没有抛出异常的情况下,之后我肯定会需要它,但是在块中创建的对象不是'外面无法访问。 我能想到的一种解决方案是在块外部创建对象,然后为它分配一个 R 值对象,我通过显式调用构造函数创建它:
Time t5;
try {
t5 = Time(23, 59, 59);
}
catch (invalid_argument& e) {
cerr << "\n\nException while initializing t5: " << e.what() << endl;
}
但这是在做不必要的事情,比如创建另一个对象只是为了尝试捕获异常。 有没有更好的方法来做到这一点?另外,从构造函数中抛出异常是一种糟糕的编程习惯吗? PS:我看到有人问了一个类似的问题,但对于 C#,而且给出的解决方案与我想出的相同,但我相信应该有更好的方法,正如我上面解释的那样。 谢谢。
取决于Time
具有哪种默认构造函数。如果它的构造函数只是将三个数字归零,那么你的解决方案就可以了。
如果它的默认构造函数很昂贵(或者根本不存在),你可以把它放到std::optional
:
std::optional<Time> t5;
try
{
t5.emplace(23, 59, 59);
}
// ...
不要以为我们真的可以在 try 块之外访问它。
解决问题的两种方法。
最好在 try 块中包含时间 t5 的用法。
利用std::optional
std::optional<Time> t5;
try
{
t5.emplace(23, 59, 59);
}
catch (invalid_argument& e) {
//exception message
}
if(t5)
{
//use t5
}