C++ 异常处理

简介: C++ 异常处理

C++ 异常处理是一种机制,用于在程序执行期间处理运行时错误或其他异常情况。它允许程序在遇到错误时执行特定的代码块,而不是立即终止执行。异常处理通过 try, catch, 和 throw 关键字来实现。

基本结构

一个基本的异常处理结构包括 try 块和至少一个 catch 块。try 块包含可能会抛出异常的代码,而 catch 块则处理这些异常。

cpp复制代码

 

try {

 

// 尝试执行的代码,可能会抛出异常

 

throw ExceptionType(some_value); // 抛出异常

 

} catch (const ExceptionType& e) {

 

// 处理异常

 

std::cerr << "Caught an exception: " << e.what() << std::endl;

 

}

抛出异常

使用 throw 关键字可以抛出一个异常。抛出的可以是任何数据类型,但最好是使用标准库中的异常类,或者自定义的异常类。

cpp复制代码

 

throw std::runtime_error("A runtime error occurred");

捕获异常

catch 块用于捕获异常。它可以指定要捕获的异常类型。可以有多个 catch 块来捕获不同类型的异常。

cpp复制代码

 

try {

 

// ... 可能抛出异常的代码 ...

 

} catch (const std::runtime_error& e) {

 

// 处理 std::runtime_error 类型的异常

 

} catch (const std::exception& e) {

 

// 处理所有 std::exception 及其派生类类型的异常

 

} catch (...) {

 

// 处理所有类型的异常(万能捕获)

 

}

异常规格(Exception Specifications)

在函数声明中,可以使用异常规格来指定函数可能抛出的异常类型。这在 C++11 及之前的版本中是一个特性,但在 C++17 中被弃用,并在 C++20 中被移除。现代 C++ 实践通常不推荐使用异常规格。

自定义异常类

你可以通过继承标准异常类(如 std::exception)来创建自定义异常类。这允许你添加额外的成员变量和成员函数来提供更详细的错误信息。

cpp复制代码

 

class MyCustomException : public std::exception {

 

private:

 

std::string message;

 

public:

 

MyCustomException(const std::string& msg) : message(msg) {}

 

virtual const char* what() const throw() {

 

return message.c_str();

 

}

 

};

 

 

 

try {

 

throw MyCustomException("A custom error occurred");

 

} catch (const MyCustomException& e) {

 

std::cerr << "Caught a custom exception: " << e.what() << std::endl;

 

}

使用异常处理的好处

· 错误处理分离:异常处理允许将错误处理代码与正常流程代码分离,使代码更加清晰。

· 错误传播:异常可以自动传播到调用栈的上层,而不需要每个函数都显式检查错误条件。

· 资源清理:在 try 块中分配的资源可以在 catch 块中安全地清理,即使在发生异常的情况下也是如此。这通常通过使用 RAII(Resource Acquisition Is Initialization)技术来实现。

注意事项

· 避免过度使用:不是所有错误情况都适合使用异常处理。在某些情况下,使用返回值或错误码可能更合适。

· 避免在析构函数中抛出异常:析构函数在对象生命周期结束时自动调用,如果在析构函数中抛出异常且未被捕获,程序将调用 std::terminate 并立即终止。

· 性能考虑:异常处理有一定的性能开销,因此,在性能敏感的代码中应谨慎使用。

总的来说,C++ 异常处理是一种强大的机制,用于处理运行时错误和其他异常情况。它允许程序在发生错误时保持结构化和可维护性,同时提供了一种清晰的错误处理模式。

 

相关文章
|
7月前
|
C++
西安石油大学C++上机实验 上机五:模板和异常处理程序设计(2 学时)
西安石油大学C++上机实验 上机五:模板和异常处理程序设计(2 学时)
23 0
|
2月前
|
安全 编译器 程序员
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用(一)
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用
31 1
|
2天前
|
存储 C++
C++ 异常处理机制详解:轻松掌握异常处理技巧
C++ 异常处理提供结构化错误管理,增强程序健壮性。通过`throw`抛出异常,`try-catch`捕获并处理。示例展示了当年龄小于18时抛出异常。优点包括提高健壮性和代码可维护性,但可能降低性能并复杂化代码。另外,介绍了四种在C++中相加两个数的方法,包括使用运算符、函数、类、STL函数和lambda表达式。
9 0
|
6天前
|
安全 编译器 C++
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
|
7天前
|
程序员 编译器 C语言
【C++高阶(七)】C++异常处理的方式
【C++高阶(七)】C++异常处理的方式
|
22天前
|
C++
C++语言异常处理学习应用案例
C++异常处理保证程序在运行时遇到错误(如除数为0)时不崩溃。以下是一个示例:程序接收用户输入的两个整数并进行除法运算。若除数为0,则抛出`std::runtime_error`异常。`try-catch`结构用来捕获并处理异常,当出现异常时,输出错误信息,使程序能继续执行。
13 4
|
29天前
|
C++
C++异常处理try和throw以及catch的使用
C++异常处理try和throw以及catch的使用
|
2月前
|
C++
11. C++异常处理
11. C++异常处理
18 0
11. C++异常处理
|
2月前
|
监控 安全 Linux
Linux C++ 环境下的FTP远程升级实现及异常处理策略
Linux C++ 环境下的FTP远程升级实现及异常处理策略
66 0
|
2月前
|
自然语言处理 安全 程序员
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用(二)
【C++ 泛型编程 进阶篇】 C++ 泛型编程 模板与异常处理、模板与友元之间的使用
26 0