c++异常处理机制

在C++中,异常处理机制是一种用于处理程序运行时错误的方法。当程序遇到错误情况时,可以通过抛出异常(throw)来中断正常的程序流程,然后在适当的地方捕获异常(catch)并进行处理。C++的异常处理机制主要包括以下关键字和概念:

1. try, catch, throw

  • try: try 块用于包围可能引发异常的代码。如果 try 块内的代码引发了异常,控制流会跳转到与异常匹配的 catch 块。
try {
    // 可能引发异常的代码
} catch (ExceptionType e) {
    // 处理异常的代码
}
  • catch: catch 块用于捕获并处理异常。当 try 块内的代码引发了与 catch 中指定的异常类型匹配的异常时,相应的 catch 块会被执行
try {
    // 可能引发异常的代码
} catch (ExceptionType1 e1) {
    // 处理 ExceptionType1 类型的异常
} catch (ExceptionType2 e2) {
    // 处理 ExceptionType2 类型的异常
} catch (...) {
    // 处理其他类型的异常
}
  • throw: throw 用于抛出异常。当程序执行到 throw 语句时,会立即跳转到匹配的 catch 块,或者终止程序执行(如果没有匹配的 catch 块)
if (error_condition) {
    throw ExceptionType("Error message"); // 抛出异常
}

2. 异常类

异常通常是由用户定义的异常类(Exception Class)的实例对象抛出的。这些异常类必须是C++的类,可以从标准库的 std::exception 类派生,也可以是任何其他自定义的类。

class MyException : public std::exception {
public:
    virtual const char* what() const throw() {
        return "My custom exception occurred";
    }
};

3. 自定义异常类案例

以下是一个自定义异常类的案例:

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

class MyException : public exception {
public:
	virtual const char* what() const throw() {
		return "My custom exception occurred";
	}
};

void process(int value) {
	if (value < 0) {
		throw MyException(); // 抛出自定义异常
	}

	// 处理正常情况
	cout << value << endl;
}

int main()
{
	try {
		int value = -1;
		process(value);// 可能引发异常的代码
	}
	catch (const MyException& e) {
		cerr << "Caught exception: " << e.what() << endl;
	}
	catch (const exception& e) {
		cerr << "Caught standard exception: " << e.what() << endl;
	}

	return 0;
}

在这个示例中,process 函数可能引发 MyException 异常,而 main 函数使用 try 块包围了可能引发异常的代码。如果 process 函数引发了 MyException 异常,它将被第一个 catch 块捕获并处理,输出异常信息。如果 process 函数引发了其他继承自 std::exception 的异常,它将被第二个 catch 块捕获并处理。

这个例子演示了如何使用 try、catch 和 throw 来处理自定义异常和标准异常。

这段代码会输出: Caught exception: My custom exception occurred

(我会在下篇文章解释下cerr和what() 虚函数是什么)

4. 标准异常类

C++标准库提供了一些常用的异常类,它们都派生自 std::exception:

  • std::runtime_error:表示在运行时发生的错误。
  • std::logic_error:表示程序逻辑错误,例如违反了先决条件。
  • std::out_of_range:表示访问超出有效范围的数据结构的元素。

这是一个使用异常处理机制的示例:

#include <iostream>
#include <stdexcept>

int main() {
    try {
        int divisor = 0;
        if (divisor == 0) {
            throw std::runtime_error("Division by zero");
        }
        int result = 10 / divisor;
        std::cout << "Result: " << result << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }
    return 0;
}

在这个示例中,如果 divisor 为零,会抛出一个 std::runtime_error 异常,然后被 catch 块捕获并输出异常信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值