请参考 TC++PL 章节 8.3、第十四章,以及附录 E。附录聚焦于如何为“苛刻的”应用程序编写异常安全(exception-safe)的代码,它并非写给初学者看的。
C++ 里,异常用于发出一种信号,表示发生了“本地”处理不了的错误,比如构造函数里某个获取资源的操作失败了。例如:
class Vector {
int sz;
int* elem;
class Range_error { };
public:
Vector(int s) : sz(s) { if (sz < 0) throw Range_error(); /* ... */ }
// ...
};
不要简单地将异常当作又一种从函数中返回一个值的方法。大多数用户以为异常处理代码等同于错误处理代码(因为 C++ 语言的定义怂恿他们这么想),他们的代码优化方式也反映了这种想当然的“以为”。
一种关键的技术被称之为资源获取即初始化(有时被简称为 RAII),该技术使用带有析构函数的类来使资源管理有序化。例如:
void fct(string s)
{
File_handle f(s,"r"); // File_handle 的构造函数打开名为 s 的文件
// 使用 f
} // File_handle 的析构函数在此关闭文件
就算 fct() 中“使用 f”的那部分代码抛出了异常,析构函数仍然会被执行,所以文件会被正常关闭。下面这种常见的不安全的用法则恰恰相反:
void old_fct(const char* s)
{
FILE* f = fopen(s,"r"); // 打开名为 s 的文件
// 使用 f
fclose(f); // 关闭文件
}
如果 old_fct 中“使用 f”的那部分代码抛出了异常(或者简单地返回了),那么文件就没有被关闭。在 C 程序里,longjmp() 是又一种危险。
原文地址:http://www.research.att.com/~bs/bs_faq2.html#exceptions
分享到:
相关推荐
* 是否需要在方法内部处理异常? * 是否需要记录日志? 结论 捕获异常和抛出异常是两种不同的机制,分别用于处理不同的异常场景。需要根据实际情况选择合适的异常处理策略,以确保程序的可靠性和稳定性。
1. 为什么使用异常? 异常处理机制的主要目的是在程序遇到不可预见的问题时,能够优雅地处理错误而不是让程序崩溃。通过异常,程序可以中断执行流程,记录并传递错误信息,以便在合适的时机进行处理。相比于传统的...
Dubbo 默认支持 Java 的序列化,但为了性能和安全性,可以考虑使用更轻量级的序列化库,如 Protobuf 或 JSON。 7. **错误码和异常信息** 在自定义异常类中定义错误码和错误信息,可以提供更清晰的错误上下文。这有...
C++的异常处理更倾向于处理程序运行时的逻辑错误,如空指针解引用、数组越界等,并且鼓励程序员使用异常来表示非正常流程,而不是返回错误码。 C++的异常处理具有以下优势: 1. 异常安全:C++的异常处理机制支持...
一.什么是异常 我们需要明白的是异常的发生不是因为我们代码写错了,我们的代码是可以编译的,但是在运行时产生了一个错误,这个错误是一个异常情况,计算机不能处理这个...第二种方法:使用try语句处理异常,事实上
* 怎么使用try-catch语句来捕获异常? 八、实验报告 实验报告包括实验目的、实验内容、实验步骤和实验结果等部分。学生需要提交实验报告,展示自己的实验结果和经验总结。 相关知识点: * 异常处理技术 * try-...
下面将从多线程编程的基础知识、线程池的使用、异常捕获三个方面进行阐述。 一、多线程编程基础知识 在 Java 中,存在两种线程模型:主线程和子线程。主线程是程序的入口点,而子线程是由主线程创建的辅助线程。...
例如,在Python中,可以使用Pandas和NumPy库来计算IQR并过滤掉异常值,使用SciPy库来计算Z-score,以及使用sklearn.ensemble库中的IsolationForest模型来识别异常值。在进行实际的异常值处理时,需要考虑到数据和...
Visual C++源代码 23 如何使用主线程异常捕获错误Visual C++源代码 23 如何使用主线程异常捕获错误Visual C++源代码 23 如何使用主线程异常捕获错误Visual C++源代码 23 如何使用主线程异常捕获错误Visual C++源代码...
**如何使用异常?** - **基本用法**:使用 `try` 块来尝试执行可能会抛出异常的代码,使用 `catch` 块来捕获并处理异常。 - **注意事项**:避免滥用异常处理作为控制流程的方式。 ##### 17. **怎样从输入中读取...
我们在捕获到异常并对异常进行处理时可能会遇到如下一些问题: 1.不确定应如何处理这些异常 2.需要记录异常日志时没有记录,或者异常在不同的地方重复记录,使得排错调试不方便 3.处理日志时,需要在每一个try-catch...
使用 Windows Network Monitor 找出异常发包程序 Windows Network Monitor 是一种功能强大的网络抓包软件,由 Microsoft 开发,能够捕获和分析网络数据包,从而帮助网络管理员快速定位和解决网络问题。本文将指导您...
(3)对抛出的异常使用try-catch进行异常处理。 实践二:使用try-catch-finally进行异常处理 需求说明 (1)对实践1的异常使用try-catch-finally进行异常处理 (2)在finally块输出是否抛出了异常 实现思路及关键...
通过合理地使用异常处理机制,我们可以捕获和处理异常,使程序在出现异常时能够以一种可控的方式进行处理,避免程序崩溃或产生不可预料的结果。这对于提高程序的健壮性和可维护性具有重要意义。
* 尽量避免使用 `catch` 子句来捕捉所有异常,而是根据实际情况捕捉特定的异常类型。 * 使用 `finally` 子句来释放资源和关闭文件、数据库等。 九、异常处理的应用场景 * 异常处理可以应用于各种场景,例如数据库...
* 应该尽量避免使用异常控制,以提高程序的执行效率。 * 应该在可能抛出异常的代码块中使用 try-catch 块,以确保程序的稳定运行。 * 应该在 catch 块中执行必要的操作,以恢复程序的状态。 八、Java 异常处理的...
- 何时使用checked异常,何时使用unchecked异常? - 如何处理多个可能的异常? - 什么是受检异常和运行时异常的区别? - 为什么finally块总是执行? - 什么时候应该使用throw和throws? - 自定义异常类应具备哪些...
在MFC应用中,通常会在C++的try/catch基础上,使用BEGIN TRY/BEGIN CATCH宏进行异常处理,这样既可以处理C++标准异常,也可以处理MFC特定的异常。 结构化异常处理(Structured Exception Handling,SEH)是Windows...
在使用Spring框架中的`RestTemplate`进行HTTP请求时,我们可能会遇到各种异常情况,如服务超时、服务不存在等,这些异常通常会导致程序中断,无法继续执行后续代码。在这种情况下,我们希望即使请求失败,也能获取到...
一、什么是异常? 在 Java 编程中,异常指的是程序在执行过程中出现的错误或意外情况,如数组下标越界、空指针、算术运算溢出等。异常可以是编译期异常,也可以是运行期异常。编译期异常是指在编译期检查出的错误,...