C++如何抛出异常

在 C++ 中,抛出异常(throwing an exception)是处理错误或异常情况的一种机制。通过使用 throw 关键字,你可以在程序运行时将某个错误情况或不期望的状态报告出去,并将控制权转交给对应的异常处理程序。

抛出异常的基本语法

要在 C++ 中抛出异常,可以使用 throw 关键字,后跟要抛出的对象。这个对象可以是基本类型、类的实例,甚至是指针。常见的抛出方式有:

throw expression;
  • expression 是要抛出的异常对象。例如,可以抛出一个整数、一个字符串、或是一个自定义的异常类对象。

示例:抛出异常

以下是一些抛出异常的基本示例:

#include <iostream>
#include <stdexcept>  // 包含标准异常类

void functionThatThrows() {
    // 抛出整数类型的异常
    throw 42;

    // 抛出C字符串的异常
    throw "An error occurred";

    // 抛出标准库中的异常类对象
    throw std::runtime_error("Runtime error occurred");
}

int main() {
    try {
        functionThatThrows();
    } catch (int e) {
        std::cout << "Caught an integer: " << e << std::endl;
    } catch (const char* e) {
        std::cout << "Caught a C-string: " << e << std::endl;
    } catch (const std::exception& e) {
        std::cout << "Caught a std::exception: " << e.what() << std::endl;
    }

    return 0;
}

解释

  • throw 42; 抛出一个整数异常。
  • throw "An error occurred"; 抛出一个 C 字符串异常。
  • throw std::runtime_error("Runtime error occurred"); 抛出一个标准库中的 std::runtime_error 异常,这是一种用于报告运行时错误的标准异常类型。 runtime_error继承了exception类

这些异常通过 try 块捕获,并在 catch 块中处理。catch 块会根据异常的类型选择对应的处理程序。

自定义异常类

C++ 允许定义自己的异常类,并抛出它们:

#include <iostream>
#include <stdexcept>

class MyException : public std::exception {//继承异常类,重写其虚函数
public:
    const char* what() const noexcept override {
        return "My custom exception";
    }
};

void functionThatThrows() {
    throw MyException();
}

int main() {
    try {
        functionThatThrows();
    } catch (const MyException& e) {
        std::cout << "Caught a MyException: " << e.what() << std::endl;
    }

    return 0;
}

在这个示例中,我们定义了一个继承自 std::exception 的自定义异常类 MyException,并在 what() 方法中返回一个错误消息。当该异常被抛出时,catch 块会捕获并处理它。

总结

  • 抛出异常 使用 throw 关键字,后跟要抛出的对象。
  • 捕获异常 使用 try-catch 结构,其中 try 块包裹可能抛出异常的代码,catch 块处理捕获到的异常。
  • 可以抛出任何类型的对象,包括基本类型、标准库的异常类,或者自定义异常类。

这种机制帮助你在遇到错误或不期望的情况时将控制权转移到专门的异常处理代码,从而提高程序的健壮性和可维护性。

查看源码可知: 默认抛出的是"Unknown exception" 如果异常没有被继承

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,运行时异常(Runtime Exception)是指程序在执行过程中由于某种意外情况或错误条件而引发的异常行为。这些异常通常不是编译时就能确定的,而是依赖于程序在特定环境下运行时的状态。C++提供了一套异常处理机制来处理这些情况,以便程序能够优雅地应对和恢复。 **1. 抛出异常(throwing an exception):** 当你遇到一个需要中断正常流程的错误情况时,可以使用`throw`关键字抛出一个异常对象。通常,你会自定义异常类来表示具体的错误类型,如`std::runtime_error`或者自定义的异常类。 ```cpp if (conditionIsInvalid) { throw customException("Invalid condition"); } ``` **2. 抛出类型(Exception types):** C++有多种内置异常类型,如`std::exception`、`std::runtime_error`、`std::logic_error`等。也可以继承这些基础异常类型创建自定义异常。 **3. 抓取异常(catching an exception):** 使用`try-catch`块捕获并处理异常。`try`块包含可能会抛出异常的代码,`catch`块则负责处理捕获到的异常。 ```cpp try { // 代码可能抛出异常的部分 } catch (const customException& e) { // 处理自定义异常 std::cerr << "Caught: " << e.what() << '\n'; } catch (const std::exception& e) { // 处理所有标准异常 std::cerr << "Caught a standard exception: " << e.what() << '\n'; } ``` **4. 堆栈跟踪(Stack unwinding):** 当异常发生时,程序会停止执行当前函数,回溯到最近的`catch`块。这个过程称为堆栈跟踪,有助于调试和找出问题源头。 **相关问题--:** 1. C++中如何定义自己的异常类? 2. 使用`catch(...)`与特定异常类型相比有何优缺点? 3. 如何决定何时使用异常处理而不是简单的错误返回值?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值