C++ says "We have try at home."
5 months ago
- #programming-languages
- #C++
- #exception-handling
- 许多支持异常处理的编程语言都提供'finally'子句,用于在代码块执行后无论是否发生异常都执行特定代码。
- C++虽然没有'finally'子句,但通过析构函数在离开作用域时执行清理代码。
- 当受保护代码块和'finally'(或析构函数)同时抛出异常时,不同语言表现各异:Java、Python、JavaScript和C#会覆盖原始异常,而C++会终止程序。
- Python 3.2+版本在'finally'中引发新异常时,会将原始异常保存为上下文信息。
- C++规定:若析构函数因异常处理而被调用时自身又抛出异常,程序将立即终止。
- 微软WIL库为C++提供了'scope_exit'清理机制,但若清理lambda抛出异常则会终止程序。
- C++的函数try块可处理构造函数中的异常,但在清理操作方面存在局限性。
- Python 3.2版本新增了'finally'中的异常链式处理机制,可保留原始异常信息。
- Java的'getSuppressed'方法处理try-with-resources中的异常,但不适用于'finally'块。
- C++最佳实践包括使用RAII机制,并避免在析构函数中抛出异常。