C++函数中引发异常并在调用方中捕获它

C++ throw an exception in a function and catch it in the caller?

本文关键字:调用 方中捕 异常 函数 C++      更新时间:2023-10-16

我有一个返回'向量'的函数。但是,有时在运行时,函数可能会遇到错误,在该错误中,它不应返回向量,而是返回可由调用方检查的值。我应该通过抛出异常并在调用者中捕获它来处理这个问题,还是应该将函数的返回类型更改为存储返回值(0 或 1(和向量的"std::p air"。如果条件发生,我不想以"std::运行时"错误退出程序。

std::vector<int> function() {
std::vector ans;
//do stuff
if (something happens)
    return -1;
return ans;
}  

这听起来像是例外的好时机。创建一个可以具有构造函数参数的可抛出类型,某种解释问题的代码。捕手可以检查该代码。

人们会建议std::variant之类的,但这很快就会变得混乱,并导致你的函数的签名膨胀。它还使调用站点上的代码复杂化。这里没有必要。例外实际上是为此用例设计的。

我的首选是std::variant(它比std::optional更好,因为它可以在出错时提供额外的信息,这在将来总是有益的(:

usign ErrorType = int;
using ReturnType = std::variant<std::vector<int>, ErrorType>
ReturnType function() {
    std::vector ans;
    //do stuff
    if (something happens)
        return -1;
    return ans;
}

如果您的错误非常罕见,并且异常可能会在更深的调用者级别咳嗽,那么异常也是一种好/更好的方法:

class MyException : public std::exception {
public:
    MyException(int errorCode) : exception("MyException"), errorCode(errorCode)
    {}
    int code() const { return errorCode; }
private:
    int errorCode;
};
std::vector<int> function() {
    std::vector ans;
    //do stuff
    if (something happens)
        throw MyException{ -1 };
    return ans;
}

请记住,在C++例外的设计方式是,当什么都没有抛出时,它们的成本为零。交易是,当抛出异常时,展开堆栈非常慢(在某些 cpp-con 上,有人说它慢了 x40,我没有测量它(。这就是为什么使用std::optionalstd::variant而不是例外可以如此有益的原因。

AFAIK 标准礼让正在研究一种新的异常机制,其行为类似于std::variant(类似于 Swift 中的制作方式(。

你可以

使用它std::optional

相关文章: