c++ - 异常处理级别/重新抛出异常
问题描述
vector
我有一个函数,它基本上从using中返回一个元素at(size_type pos)
。在无效 (out_of_range) 位置的情况下at()
引发异常。std::out_of_range
我基本上希望将此异常传播给调用者,以便可以在该级别上对其进行处理。我添加到我的吸气剂中的重新抛出是否有必要?或者我会通过完全省略它们来获得相同的效果try-catch
吗?
int MyClass::GetNumber(size_t a_Idx) const
{
// Is the following try-catch-rethrow necessary? Or can the whole try-catch be omitted?
try
{
return m_Numbers.at(a_Idx);
}
catch (const std::out_of_range&)
{
// A throw expression that has no operand re-throws the exception currently being handled
throw;
}
}
MyClass m;
try
{
int t = m.GetNumber(42);
}
catch(const std::out_of_range&){}
我都试过了,没有发现任何区别,但我想知道我是否幸运,或者这是否有保证。
解决方案
抛出的异常std::vector::at()
,与任何其他异常一样(如果我错了,请有人纠正我),将展开堆栈,直到它到达它被捕获的 try-catch 块,或者如果它没有被捕获,则会导致未处理的异常错误任何级别。
因此,如果您的唯一意图是在调用者级别捕获它,而无需任何中间异常处理,则无需在适当位置捕获并重新抛出它:它将到达调用者的 try-catch 块,前提是没有中间 try-catch块处理它。
推荐阅读
- python - Visual Studio Code - MS python intellisense - 缩进/换行
- c# - c# 遍历通过会话传递的字典
- python - 就最低计算复杂度而言,如何创建一个新的 pandas 列,该列基于另一列增加一定数量
- variable-assignment - 匈牙利算法:确定覆盖全零的最小行数
- c - 成功插入后在二叉树中“丢失”我的根地址
- spring-boot - 运行 Spring Batch 作业的最佳方法
- android - EXPO 接收通知在应用程序处于后台/前台时有效,但在应用程序被终止时无效
- python - 如何制作带有循环行的数据框?熊猫
- java - java.lang.NoClassDefFoundError: org/telegram/telegrambots/meta/exceptions/TelegramApiException
- javascript - ReactJs:useState 使字符串为空