白骑士的C++教学高级篇 3.4 异常处理

19 篇文章 0 订阅

系列目录

上一篇:白骑士的C++教学高级篇 3.3 内存管理

        在编写C++程序时,我们不可避免地会遇到各种错误和异常情况。异常处理是一种有效的错误处理机制,可以使程序更加健壮和可靠。C++提供了一套完整的异常处理机制,包括 ‘try‘、‘catch‘ 和 ‘throw‘ 语句,以及支持自定义异常类型。本篇博客将详细介绍C++中的异常处理机制,帮助您更好地掌握这一重要编程技术。

异常的基本概念

        异常(Exception)是程序运行过程中出现的异常情况或错误事件,如内存分配失败、文件读取错误等。当程序遇到异常情况时,异常处理机制允许程序员捕获并处理这些异常,以避免程序崩溃或产生不正确的结果。

        在C++中,异常处理机制通过三个关键字来实现:‘try‘、‘catch‘ 和 ‘throw‘。

try语句

        ‘try‘语句块用于包围可能会抛出异常的代码。当异常发生时,程序会立即跳转到与之匹配的‘catch‘语句块进行处理,例如:

try {
    // 可能抛出异常的代码
}

catch语句

        ‘catch‘ 语句块用于捕获和处理异常。‘catch‘ 语句块紧跟在 ‘try‘ 语句块之后,可以有多个‘catch‘ 块来处理不同类型的异常,例如

try {
    // 可能抛出异常的代码
} 

catch (const std::exception& e) {
    // 处理异常
}

throw语句

        ‘throw‘ 语句用于抛出异常,可以抛出内置类型或用户自定义类型的异常,例如:

throw std::runtime_error("An error occurred");

try, catch, throw语句

        在C++中,异常处理通过 ‘try‘、‘catch‘ 和 ‘throw‘ 语句来实现。下面是一个基本的异常处理示例:

#include <iostream>
#include <stdexcept>


void mayThrow(bool shouldThrow) {
    if (shouldThrow) {
        throw std::runtime_error("An error occurred");
    }
}


int main() {
    try {
        mayThrow(true);
    } 

    catch (const std::exception& e) {
        std::cerr << "Caught exception: " << e.what() << std::endl;
    }

    std::cout << "Program continues..." << std::endl;

    return 0;
}

        在这段代码中,我们定义了一个函数 ‘mayThrow‘,该函数根据参数决定是否抛出异常。在 ‘main‘ 函数中,我们使用 ‘try‘ 语句块包围调用 ‘mayThrow‘ 的代码,并在 ‘catch‘ 语句块中捕获并处理异常。捕获到异常后,程序继续执行后续代码。

多个catch块

        一个 ‘try‘ 语句块可以有多个 ‘catch‘ 块,以处理不同类型的异常:

#include <iostream>
#include <stdexcept>


void mayThrow(int errorType) {
    if (errorType == 1) {
        throw std::runtime_error("Runtime error");
    } 

    else if (errorType == 2) {
        throw std::logic_error("Logic error");
    } 
    
    else if (errorType == 3) {
        throw "Unknown error";
    }
}


int main() {
    try {
        mayThrow(2);
    } 

    catch (const std::runtime_error& e) {
        std::cerr << "Caught runtime error: " << e.what() << std::endl;
    } 

    catch (const std::logic_error& e) {
        std::cerr << "Caught logic error: " << e.what() << std::endl;
    } 

    catch (...) {
        std::cerr << "Caught unknown error" << std::endl;
    }

    std::cout << "Program continues..." << std::endl;

    return 0;
}

        在这段代码中,我们定义了一个函数 ‘mayThrow‘,它可以抛出多种类型的异常。在 ‘main‘ 函数中,我们使用多个 ‘catch‘ 块来分别捕获和处理不同类型的异常。‘catch(...)‘ 语句块用于捕获所有未明确捕获的异常类型。

自定义异常

        除了标准库提供的异常类型之外,C++还允许程序员定义自己的异常类型。自定义异常可以提供更多上下文信息,帮助更好地诊断和处理错误。

定义自定义异常类

        自定义异常类通常继承自 ‘std::exception‘ 或其子类,并重写 ‘what‘ 方法以提供异常信息,例如:

#include <iostream>
#include <exception>


class MyException : public std::exception {
public:
    MyException(const char* message) : msg_(message) {}

    virtual const char* what() const noexcept override {
        return msg_;
    }


private:
    const char* msg_;
};


void mayThrow(bool shouldThrow) {
    if (shouldThrow) {
        throw MyException("Custom error occurred");
    }
}


int main() {
    try {
        mayThrow(true);
    } 

    catch (const MyException& e) {
        std::cerr << "Caught custom exception: " << e.what() << std::endl;
    } 

    catch (const std::exception& e) {
        std::cerr << "Caught standard exception: " << e.what() << std::endl;
    }

    std::cout << "Program continues..." << std::endl;

    return 0;
}

        在这段代码中,我们定义了一个名为 ‘MyException‘ 的自定义异常类,并在 ‘mayThrow‘ 函数中抛出该异常。在 ‘main‘ 函数中,我们捕获并处理自定义异常。

自定义异常的使用场景

        自定义异常通常用于以下场景:

  1. 提供更详细的错误信息:通过自定义异常类,可以提供更多上下文信息,帮助更好地诊断和处理错误。
  2. 区分不同类型的错误:通过定义多个自定义异常类,可以区分不同类型的错误,并采取相应的处理措施。
  3. 嵌套异常:在复杂系统中,自定义异常可以用于嵌套异常处理,记录错误的传递路径。

总结

        异常处理是C++编程中的一个重要技术,通过合理使用异常处理机制,可以提高程序的健壮性和可维护性。C++提供了完整的异常处理机制,包括‘try‘、‘catch‘和‘throw‘语句,以及支持自定义异常类型。本篇内容详细介绍了异常的基本概念、‘try‘、‘catch‘、‘throw‘语句的使用,以及自定义异常的定义与应用。希望通过这些内容,能更好地掌握C++中的异常处理技术,为编写健壮、可靠的C++程序打下坚实的基础。

下一篇:白骑士的C++教学实战项目篇 4.1 简单的计算器​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白骑士所长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值