标签:__ do ... C++ 几种 try error scope 错误处理
-
goto
跳转集中处理int func() { if(!try_do_a()) goto END_FUNC; if(!try_do_b()) goto END_FUNC; // ... return 0; END_FUNC: // do something }
-
do{...}while(0)
(原理同上, 其实就是 goto 的另一种形式)int func() { int r = 0; do { if(!try_do_a()) { r = ...; break; } if(!try_do_b()) { r = ...; break; } // ... }while(0); if(r != 0) { // do something } else return 0; }
1. & 2. 适用于大部分错误, 可以告知调用者具体错误.
-
利用
throw
和try{...}catch(...){...}
int func() { if(!try_do_a()) throw some_error_data; if(!try_do_b()) throw some_error_data; // ... return 0; } int caller() { try { func(); } catch(error_data_type& e) { // do something } }
适用于出现重大且不可恢复的错误.
-
利用 C++ RAII 机制在变量析构时处理 (在 C++11 之后配合 lambda 更加方便)
class __scope_error { public: explicit __scope_error(std::function<void()> in_on_exit) : m_on_exit(in_on_exit), m_is_noerror(false) {} ~__scope_error() { if (!m_is_noerror) m_on_exit(); } __scope_error(const __scope_error&) = delete; __scope_error& operator=(const __scope_error&) = delete; void ok() { m_is_noerror = true; } private: std::function<void()> m_on_exit; bool m_is_noerror; }; int func() { __scope_error se(a_func); if(!try_do_a()) return -1; if(!try_do_b()) return -1; // ... se.ok(); return 0; }
适用于绝大多数错误, 推荐使用.
标签:__,do,...,C++,几种,try,error,scope,错误处理 来源: https://www.cnblogs.com/ipnah/p/15531249.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。