如何在捕获异常后退出程序执行
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?
这里有两个问题。
- return 什么都合适吗?
- 什么是 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
}
}
我在看这个问题的答案:
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?
这里有两个问题。
- return 什么都合适吗?
- 什么是 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
}
}