C++函数中引发异常并在调用方中捕获它
C++ throw an exception in a function and catch it in the caller?
我有一个返回'向量'的函数。但是,有时在运行时,函数可能会遇到错误,在该错误中,它不应返回向量,而是返回可由调用方检查的值。我应该通过抛出异常并在调用者中捕获它来处理这个问题,还是应该将函数的返回类型更改为存储返回值(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::optional
或std::variant
而不是例外可以如此有益的原因。
AFAIK 标准礼让正在研究一种新的异常机制,其行为类似于std::variant
(类似于 Swift 中的制作方式(。
你可以
使用它std::optional
。
相关文章:
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 调用方如何知道 VARIANT 中何时有十进制?
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 通过 C++ 中的指针将子对象值传递给被调用方类
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 识别 capnproto RPC 中的调用方
- 如何防止方法的调用方将结果存储在C++中
- 谷歌测试有没有办法为被调用函数中的断言生成调用方行号
- C++函数中引发异常并在调用方中捕获它
- 为什么当数组作为调用方函数中的参数传递时,不能在被调用函数中使用 foreach 循环打印数组的值
- 在C++中查找函数的调用方(Visual Studio)
- 有没有办法在 VisitCallExpr 方法中使用 clang 获取 CallExpr* 的调用方
- 为什么包装在函数中的 GAS 内联程序集为调用方生成的指令与纯程序集函数不同
- 如何在 ATL COM+ 进程外服务器应用程序中标识调用方的进程?
- 如何在替换调用方并在 xp/vista/7 上运行的窗口中从我的 VS2008/C++ 应用程序执行程序
- 当按引用传递参数存储在被调用方对象中,然后被调用方删除时会发生什么情况
- 在公共对象文件中分隔调用方
- 从MFC中的DoDataExchange确定调用方ID
- abort() 的调用方在回溯中是未知的,任何调试它的建议
- C++释放传递给函数中参数的内存,或者将其留给调用方