一、异常概述
异常是指程序执行时出现的意外或异常情况,如除数为0,文件不存在等。这些异常导致程序无法正常执行,甚至崩溃。C++中提供了异常处理机制,能够在程序出现异常时进行捕获和处理,让程序更加健壮。
二、异常处理语句
C++中使用try-catch语句进行异常处理,通过捕获异常并在catch语句中进行相应处理,使程序在出现异常时能够继续执行。
try { // 可能出现异常的代码块 } catch (ExceptionType e) { // 异常处理代码 }
try语句块中包含可能会抛出异常的代码,当异常被抛出时,程序会跳转到catch语句中进行异常处理。ExceptionType为自定义类型,捕获指定类型的异常。catch语句可以有多个,分别处理不同类型的异常。
三、自定义异常
C++中可以自定义异常类型,用于区分不同的异常情况。自定义异常需要继承自std::exception类,并重载其what()方法,返回异常的描述信息。
class CustomException : public std::exception { public: const char* what() const throw() { return "This is a custom exception"; } };
在程序中抛出自定义异常:
try { throw CustomException(); } catch (std::exception& e) { std::cout << e.what() << std::endl; // 输出异常描述信息 }
四、异常传递
异常可以在函数间传递,用于在高层调用函数中处理异常。当函数中出现异常,程序跳转到调用函数中进行异常处理,继续将异常传递给调用函数,直到异常被处理或程序终止。
void func1() { try { func2(); // 调用函数2 } catch (std::exception& e) { std::cout << e.what() << std::endl; throw; // 抛出异常 } } void func2() { throw CustomException(); // 抛出自定义异常 }
在程序中调用函数1:
try { func1(); // 调用函数1 } catch (std::exception& e) { std::cout << e.what() << std::endl; }
五、异常安全
在程序中,异常可能会导致资源没有释放或部分释放,造成资源泄露或错误。为了避免这种情况,可以使用异常安全的代码。
异常安全的代码分为三个级别,分别为:
- 基本异常安全(Basic exception safety):不会泄露资源,但程序状态可能已被修改。
- 强异常安全(Strong exception safety):程序状态和资源都不会发生改变。
- 不抛出异常保证(No-throw guarantee):不会发生异常。
为了实现强异常安全,可以使用RAII(资源获取即初始化)技术,将资源的分配和释放放在同一个类中进行,通过构造函数和析构函数来实现自动化管理。在异常发生时,调用析构函数自动释放资源。
class Test { private: int* ptr; public: Test() { ptr = new int; } ~Test() { delete ptr; } };
在程序中使用RAII:
void func() { Test t; // RAII资源管理类 // 可能抛出异常的代码 }
六、总结
通过C++异常处理机制,能够让程序在出现异常时进行捕获和处理,提高程序的健壮性。通过自定义异常类型和异常传递,能够进行更加详细的异常处理。在编写代码时,需要考虑到异常安全,避免资源泄露和错误。