首页 > 后端开发 > C++ > 正文

C++异常处理 try catch throw结构

P粉602998670
发布: 2025-09-10 11:02:01
原创
221人浏览过
C++异常处理通过try、catch、throw实现,支持栈展开与RAII,适用于构造失败、不可恢复错误等场景,但应避免用于常规控制流或性能敏感代码。

c++异常处理 try catch throw结构

C++异常处理机制的核心在于优雅地处理程序运行时可能出现的非预期情况,避免程序崩溃,并提供恢复或清理资源的机会。它通过

try
登录后复制
catch
登录后复制
throw
登录后复制
这三个关键字实现。简单来说,
try
登录后复制
块包裹可能抛出异常的代码,
catch
登录后复制
块捕获并处理特定类型的异常,而
throw
登录后复制
语句则用于显式地抛出异常。

解决方案

C++的异常处理机制允许程序在遇到错误时,将控制权转移到专门处理错误的代码块,从而提高程序的健壮性和可靠性。

首先,

try
登录后复制
块定义了一个代码区域,如果在该区域内发生了异常,程序会尝试找到一个合适的
catch
登录后复制
块来处理这个异常。
try
登录后复制
块本身并不处理异常,它只是“观察”代码是否会抛出异常。

立即学习C++免费学习笔记(深入)”;

try {
  // 可能抛出异常的代码
  int result = divide(a, b);
  std::cout << "Result: " << result << std::endl;
}
登录后复制

其次,

catch
登录后复制
块紧跟在
try
登录后复制
块之后,用于捕获并处理特定类型的异常。一个
try
登录后复制
块可以有多个
catch
登录后复制
块,每个
catch
登录后复制
块处理不同类型的异常。当
try
登录后复制
块中的代码抛出一个异常时,程序会按照
catch
登录后复制
块出现的顺序,依次检查每个
catch
登录后复制
块能否处理该异常。如果找到了匹配的
catch
登录后复制
块,就执行该
catch
登录后复制
块中的代码。

catch (const std::runtime_error& error) {
  // 处理 runtime_error 类型的异常
  std::cerr << "Runtime error: " << error.what() << std::endl;
} catch (const std::exception& error) {
  // 处理 std::exception 类型的异常
  std::cerr << "Exception occurred: " << error.what() << std::endl;
} catch (...) {
  // 处理所有其他类型的异常 (catch-all)
  std::cerr << "Unknown exception occurred." << std::endl;
}
登录后复制

注意

catch(...)
登录后复制
,这是一个通用的
catch
登录后复制
块,它可以捕获任何类型的异常。但是,通常建议将其放在所有其他
catch
登录后复制
块之后,因为它会阻止后续的
catch
登录后复制
块被执行。

最后,

throw
登录后复制
语句用于显式地抛出一个异常。当程序遇到一个无法处理的错误时,可以使用
throw
登录后复制
语句抛出一个异常对象。这个异常对象可以是任何类型,但通常建议使用标准异常类,例如
std::runtime_error
登录后复制
std::invalid_argument
登录后复制
,因为它们提供了有用的错误信息。

double divide(double a, double b) {
  if (b == 0) {
    throw std::runtime_error("Division by zero!");
  }
  return a / b;
}
登录后复制

如果

throw
登录后复制
语句没有在
try
登录后复制
块中被捕获,程序会调用
std::terminate
登录后复制
函数,导致程序异常终止。

C++异常处理的一个关键点是栈展开(stack unwinding)。当异常被抛出时,程序会沿着调用栈向上查找匹配的

catch
登录后复制
块。在查找的过程中,程序会销毁所有在
try
登录后复制
块中创建的局部对象,以确保资源得到正确释放。这也被称为RAII (Resource Acquisition Is Initialization)。

BibiGPT-哔哔终结者
BibiGPT-哔哔终结者

B站视频总结器-一键总结 音视频内容

BibiGPT-哔哔终结者 28
查看详情 BibiGPT-哔哔终结者

如何自定义异常类?

自定义异常类可以提供更具体的错误信息,并允许针对特定类型的错误进行定制处理。通常,自定义异常类应该继承自

std::exception
登录后复制
或其子类。

#include <exception>
#include <string>

class MyException : public std::exception {
public:
  MyException(const std::string& message) : message_(message) {}

  const char* what() const noexcept override {
    return message_.c_str();
  }

private:
  std::string message_;
};

// 使用自定义异常
int processData(int value) {
  if (value < 0) {
    throw MyException("Value must be non-negative.");
  }
  return value * 2;
}

int main() {
  try {
    int result = processData(-5);
    std::cout << "Result: " << result << std::endl;
  } catch (const MyException& e) {
    std::cerr << "MyException caught: " << e.what() << std::endl;
  } catch (const std::exception& e) {
    std::cerr << "Standard exception caught: " << e.what() << std::endl;
  }
  return 0;
}
登录后复制

在这个例子中,

MyException
登录后复制
继承自
std::exception
登录后复制
,并添加了一个
message_
登录后复制
成员变量来存储错误信息。
what()
登录后复制
方法被重写,以返回自定义的错误信息。

异常处理的性能开销有多大?

异常处理确实会带来一定的性能开销,尤其是在异常被抛出时。栈展开和查找

catch
登录后复制
块的过程可能会比较耗时。因此,应该避免过度使用异常处理,只在真正需要处理错误的情况下才使用它。

一些观点认为,异常处理应该仅用于处理真正“异常”的情况,而不是作为常规的控制流机制。例如,可以使用返回值来指示函数是否成功执行,而不是总是抛出异常。

但是,在某些情况下,使用异常处理可以简化代码,并提高代码的可读性和可维护性。例如,在构造函数中,如果对象初始化失败,抛出异常是一种清晰的处理方式。

何时应该使用异常处理?

以下是一些适合使用异常处理的场景:

  • 构造函数失败: 如果构造函数无法成功初始化对象,应该抛出异常。
  • 无法恢复的错误: 如果程序遇到了无法通过其他方式恢复的错误,应该抛出异常。
  • 跨越多个函数调用的错误: 如果错误需要在多个函数调用之间传递,使用异常处理可以避免显式地传递错误码。
  • 需要进行资源清理的错误: 异常处理可以确保在错误发生时,资源得到正确释放。

以下是一些不适合使用异常处理的场景:

  • 可以预测的错误: 如果错误是可以预测的,并且可以通过其他方式处理,例如使用返回值或错误码,则不应该使用异常处理。
  • 性能敏感的代码: 在性能敏感的代码中,应该尽量避免使用异常处理,因为它会带来额外的性能开销。
  • 作为常规的控制流: 异常处理不应该被用作常规的控制流机制。

总而言之,C++的异常处理机制是一种强大的工具,可以提高程序的健壮性和可靠性。但是,应该谨慎使用,并根据具体情况选择合适的错误处理方式。

以上就是C++异常处理 try catch throw结构的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号