如何使用在 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 块之外访问它。

解决问题的两种方法。

  1. 最好在 try 块中包含时间 t5 的用法。

  2. 利用std::optional

   std::optional<Time> t5;
    try
    {
        t5.emplace(23, 59, 59);
    }
    catch (invalid_argument& e) {
        //exception message
    }

    if(t5)
    {
        //use t5
    }