【发布时间】:2013-08-14 14:03:18
【问题描述】:
我对异常处理的理解非常有限。虽然我发现抛出异常很容易(或者我可以使用expected<T> 打包以供以后使用),但我对如何处理异常知之甚少。
目前我的知识仅限于
-
清理我自己的资源并在适当的位置重新抛出要处理的异常。例如
ptr p = alloc.allocate(n); try { uninitialized_copy(first,last,p);//atomic granularity, all or none } catch(...) { alloc.deallocate(p,n); throw; }
但我想,这可以等效地转换为 RAII 模式
alloc_guard<ptr> p{alloc.allocate(n)};
uninitialized_copy(first,last,p.get());
p.commit();
-
在顶层捕获异常,编写并打印一条好消息并退出。例如
int main(int argc,char** argv) { try { app_t the_app(argc,argv); the_app.run(); } catch(std::runtime_error& e) { //instead of what, I can also compose the mesage here based on locale. std::cout<<e.what()<<std::endl; } }
所以,我所做的只是在诸如main 之类的顶级函数中捕获异常并打印适当的消息并关闭。
在使用各种外部库作为实现的后端来实现具有一组不错的 API 的库时,我意识到第三方库异常是我的 API 规范的一部分,因为它们跨越了我的库边界并进入了用户代码!
因此,我的库 API 将我正在使用的外部库(每个库都有自己的异常层次结构)中的所有异常泄露给了用户代码。
这引出了我的问题,当我发现任何异常时都可以做什么?
更具体地说,
- 我能否将捕获的异常从外部库转换为我自己的异常并以通用方式抛出(比如第三方库异常层次结构和我的异常 API 之间的映射以
mpl::map的形式提供)? - 我可以做一些比打印消息/调用堆栈更有用的事情吗,比如使用不同的输入参数在 throw 站点恢复函数(比如当我得到
file_not_found或disk_error时,重新运行函数不同的文件)? - 还有其他值得了解的模式吗?
谢谢
【问题讨论】:
标签: c++ exception c++11 exception-handling try-catch