主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
C++

C++ 基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

C++ 字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

C++ 函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

C++ 面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

C++ 高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

C++ 异常处理


上一章 下一章

一. C++ 异常处理

异常是程序执行过程中出现的问题。C++ 异常是程序运行时出现的特殊情况的响应,例如尝试除以零。

异常提供了一种从程序的一部分转移控制到另一部分的方法。C++ 的异常处理建立在三个关键字之上:try、catch 和 throw。

二. throw 关键字

当问题出现时,程序会抛出异常。这是通过 throw 关键字完成的。

三. catch 关键字

程序使用异常处理程序捕获异常,即在程序中您希望处理问题的地方。catch 关键字用于表示捕获异常。

四. try 关键字

try 代码块标识出某段代码,这段代码中可能会激活特定的异常。它后面跟着一个或多个 catch 代码块。

假设某段代码可能引发异常,方法是使用 try 和 catch 关键字的组合来捕获异常。try/catch 块围绕可能生成异常的代码。try/catch 块中的代码称为受保护代码,语法如下:

try {
   // 受保护的代码
} catch( ExceptionName e1 ) {
   // 异常处理代码块
} catch( ExceptionName e2 ) {
   // 异常处理代码块
} catch( ExceptionName eN ) {
   // 异常处理代码块
}

您可以列出多个 catch 语句,以捕获不同类型的异常,前提是 try 块在不同情况下引发多个异常。

五. 抛出异常

在代码块的任何地方都可以使用 throw 语句抛出异常。throw 语句的操作数决定异常的类型,并且可以是任何表达式。表达式结果的类型决定了抛出异常的类型。

示例

以下示例演示了当发生除以零的情况时抛出异常:

double division(int a, int b) {
   if( b == 0 ) {
      throw "Division by zero condition!";
   }
   return (a/b);
}

六. 捕获异常

try 块后的 catch 块捕获任何异常。您可以指定要捕获哪种类型的异常,这是由关键字 catch 后括号中的异常声明决定的。

try {
   // 受保护的代码
} catch( ExceptionName e ) {
  // 处理 ExceptionName 类型异常的代码
}

上述代码将捕获 ExceptionName 类型的异常。如果您希望 catch 块处理 try 块中抛出的任意类型的异常,则必须在括号中包含省略号 ...,如下所示:

try {
   // 受保护的代码
} catch(...) {
  // 处理任意异常的代码
}

示例

以下示例抛出除以零的异常,并在 catch 块中捕获该异常:

#include <iostream>
using namespace std;

double division(int a, int b) {
   if( b == 0 ) {
      throw "Division by zero condition!";
   }
   return (a/b);
}

int main () {
   int x = 50;
   int y = 0;
   double z = 0;
 
   try {
      z = division(x, y);
      cout << z << endl;
   } catch (const char* msg) {
     cerr << msg << endl;
   }

   return 0;
}

由于我们抛出的是 const char* 类型的异常,因此在捕获该异常时必须使用 const char* 类型的 catch 块。如果我们编译并运行上述代码,将会生成以下结果:

Division by zero condition!

七. C++ 标准异常

C++ 提供了一组在 <exception> 头文件中定义的标准异常,我们可以在程序中使用这些异常。它们按父子类层次结构排列,以下是每个异常的简要描述:

C++ Exceptions Hierarchy

  1. std::exception
    所有标准 C++ 异常的父类。

  2. std::bad_alloc
    由 new 操作符抛出。

  3. std::bad_cast
    由 dynamic_cast 抛出。

  4. std::bad_exception
    用于处理意外异常的设备。

  5. std::bad_typeid
    由 typeid 抛出。

  6. std::logic_error
    通过阅读代码可以检测到的逻辑错误。

  7. std::domain_error
    使用数学上无效的域时抛出。

  8. std::invalid_argument
    由于无效参数抛出。

  9. std::length_error
    当创建过大的 std::string 时抛出。

  10. std::out_of_range
    例如,由 std::vector 和 std::bitset<>::operator[]() 方法的 at 抛出。

  11. std::runtime_error
    无法通过阅读代码检测到的运行时错误。

  12. std::overflow_error
    数学溢出时抛出。

  13. std::range_error
    当尝试存储超出范围的值时抛出。

  14. std::underflow_error
    数学下溢时抛出。

八. 定义新的异常

您可以通过继承和重写 exception 类功能来定义自己的异常。

示例

以下示例演示了如何使用 std::exception 类以标准方式实现自定义异常:

#include <iostream>
#include <exception>
using namespace std;

struct MyException : public exception {
   const char * what () const throw () {
      return "C++ Exception";
   }
};
 
int main() {
   try {
      throw MyException();
   } catch(MyException& e) {
      std::cout << "MyException caught" << std::endl;
      std::cout << e.what() << std::endl;
   } catch(std::exception& e) {
      // 其他错误
   }
}

这将生成以下结果:

MyException caught
C++ Exception

在这里,what() 是 exception 类提供的公共方法,所有子异常类都重写了该方法。它返回异常的原因。

上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图