gpt4 book ai didi

c++ - 如何在捕获异常后退出程序执行

转载 作者:行者123 更新时间:2023-11-30 02:18:32 28 4
gpt4 key购买 nike

我在看这个问题的答案: Program doesn't stop after exception

公认的作者提出了多种技术来在捕获异常时退出程序,但也指出

exit and abort will NOT call the destructors of your local objects.

那么,如果我使用第一个建议,即使用 return 关键字,我怎么知道要返回什么?

例如,我正在写一个Stack<T>类并像这样实现了 Pop 函数:

template <typename T>
T Stack<T>::Pop() {

try {

return m_stack[--m_current_index];

} catch(OutOfBoundsException &obe) {

std::cout << "Stack Underflow" << std::endl;
}

}

在这里,m_stackArray<T> 类型的自定义数组对象抛出 OutOfBoundsException .

Stack<T>遵循一个非常基本的实现策略,其中 m_current_index代表Stack的顶部,Stack的大小是固定的。所以任何 push 和 pop 操作只是递增或递减 m_current_index .

假设我的栈实例化为Stack<int> int_stack;并且我已经删除了 Stack 上的所有值。现在,当我调用 Pop 函数 ( int_stack.Pop()) 时,我得到以下输出。

Stack Underflow
5

5 是数组索引 0 处的值。

现在,如果我在捕获到异常时使用 return 关键字退出程序,我真的不能只返回一个整数,因为尽管遇到异常,用户可能认为它是整数堆栈上的有效值。

最佳答案

So,if I use the first suggestion, which is to use the return keyword, how do I know what to return?

这里有两个问题。

  1. 是否适合退回任何东西?
  2. 什么是合适的返回值?

如果第一个问题的答案是"is",那么第二个问题是相关的。如果第一个问题的答案是“否”,则第二个问题不相关。

对于您的情况,我认为第一个问题的答案是“否”。如果您希望调用本地对象的析构函数,最好的选择是在 std::cout 行之后抛出异常。

template <typename T>
T Stack<T>::Pop() {

try {

return m_stack[--m_current_index];

} catch(OutOfBoundsException &obe) {

std::cout << "Stack Underflow" << std::endl;
throw; // Throw the same exception
}
}

关于c++ - 如何在捕获异常后退出程序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52047367/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com