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

How to exit program execution after catching exception

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

被接受的作者提出了多种技术来在捕获异常时退出程序,但也注意到

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

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

例如,我正在写一个Stack<T> class并且已经实现了这样的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_stack 是类型为 Array<T> 的自定义数组对象,它抛出一个 OutOfBoundsException.

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

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

Stack Underflow
5

5 是数组索引 0 处的值。

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

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

这里有两个问题。

  1. return 什么都合适吗?
  2. 什么是 return 的合适值?

如果第一个问题的答案是"Yes",那么第二个问题是相关的。如果第一个问题的答案是"No",那么第二个问题不相关。

对于你的情况,我认为第一个问题的答案是 "No"。如果您希望调用本地对象的析构函数,最好的选择是在 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
    }
}