【08】别让异常逃离析构函数
1、考虑一个类Widget,析构方法抛出异常,一个集合中包含10个Widget对象,集合离开作用域,逆序撤销集合里的对象,最后一个抛出异常,倒数第二个抛出异常,问题出现了,这种情况下,要么导致程序结束,要么导致不明确行为。
2、因此,绝不能在析构方法中抛出异常。考虑,数据库连接类DBConn,用户可能会忘记关闭连接,因此在DBConn的析构方法中,执行Close方法。那么问题来了,close方法可能会抛出异常,怎么办?
a、在析构方法中,捕获异常,结束程序,这种方法可用性太差。
b、在析构方法中,捕获异常,吞下异常,这种方法忽略错误,程序继续运行,接下来可能会导致不明确行为。
3、上面两种解决办法都不好,有没有更好的办法呢?
设计异常的目的就是,将问题检测和问题处理分离。显然,DBConn不知道怎么处理问题(结束程序和吞下异常都不合适),那就应该抛出去,让用户处理。既然Close方法可能有异常,而析构方法抛出异常总是危险,更好的解决办法,暴露Close方法,让用户决定怎么处理异常。同时,在析构方法中,再做一次检查。
分类:
Effective C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2012-01-16 C# 字段、属性、变量