捕获异常后如何退出程序执行
How to exit program execution after catching exception
我正在查看这个问题的答案: 程序在异常
后不会停止
被接受的作者提出了各种技术,以便在捕获异常时退出程序,但也指出
退出和中止不会调用本地对象的析构函数。
那么,如果我使用第一个建议,即使用 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_stack
是Array<T>
类型的自定义数组对象,它抛出一个OutOfBoundsException
。
Stack<T>
遵循一个非常基本的实现策略,其中m_current_index
表示堆栈的顶部,堆栈大小是固定的。因此,任何推送和弹出操作都只是递增或递减m_current_index
。
假设我的堆栈被实例化为Stack<int> int_stack;
并且我已经弹出了堆栈上的所有值。现在,当我调用 Pop 函数 (int_stack.Pop()
( 时,我得到以下输出。
堆栈底流
5
5 是位于数组索引 0 处的值。
现在,如果我使用 return 关键字在捕获异常时退出程序,我实际上不能只返回一个整数,因为尽管收到异常,用户可能会认为它是整数堆栈上的有效值。
那么,如果我使用第一个建议,即使用 return 关键字,我怎么知道要返回什么?
这里有两个问题。
- 退回任何东西是否合适?
- 返回的适当值是什么?
如果第一个问题的答案是"是",那么第二个问题是相关的。如果第一个问题的回答是"否",那么第二个问题就无关紧要了。
就您而言,我认为第一个问题的答案是"否"。如果要调用本地对象的析构函数,最好的选择是在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
}
}
相关文章:
- 为什么异常不退出程序?
- 如何在程序执行时查看Valgrind Massif输出(或其他堆分析器)?
- 虽然循环在使用回车键时不退出程序
- 如何进行程序执行检查
- 如果 I/O read() 处于阻塞阶段,如何使用 Ctrl+C 退出 C++ 程序?
- 捕获异常后如何退出程序执行
- 在程序执行期间从标准输出重定向到自定义流
- 在C++中使用exit()退出程序有问题吗
- 从函数打印 CLI 帮助消息后,我应该如何干净地退出 C++ 程序?
- 为什么 C++ openMP 程序执行时间更长
- 从Qt应用程序执行MSI文件
- 如何实现否定用户输入退出程序和打印列表?
- 应用程序执行器 vs lpsz用户名 ADsOpenObject.
- gdb 退出:程序接收信号 SIGILL,使用 gcc / intel_mkl / gfortran -mavx 编译的
- C++:程序执行时"Not Responding"
- JIT 编译器及其在 C++ 前面加快 .NET 中程序执行速度的好处
- 如何让 c++ 程序执行以响应文件打开
- 试图调节我的 do-while 以停止在终端中退出程序.菜单不会根据需要循环使用当前语句
- 防止从其他程序执行库中的函数
- 如何在C++中退出程序执行