Some guide
Exception-safe definition:
- Basic
invariants and no resource are leaked
- Strong
operations has either completed successfully or throw exception leaving program
state exactlyly as it was before the operation started
- No-throw
operation will not emit an exception
Exception guide line:
- Throw by value
- Catch by reference
- no exception specification
* function can not template partial specialization
Some code example:
#include <iostream> void foo() throw () { // it will cause abort // because it throw when the exception specification said NO throw(1); } void goo() { try { int a = 1; throw(1); } catch(...) { // this will cause abort too // because you can not rethrow in catch statement throw; } } /* * The following is the C API for C++ library pattern to handle exception */ int getReturnCodeFromException() { try { // rethrow throw; } catch(int a) { return -1; } catch(double b) { return -2; } // for each type of exception, you can create different return code // ... } void cppAPI1() { throw (1); } void cppAPI2() { throw (1.12); } int cAPI1() { try { cppAPI1(); } catch(...) { int rc = getReturnCodeFromException(); return rc; } } int cAPI2() { try { cppAPI2(); } catch(...) { int rc = getReturnCodeFromException(); return rc; } } int main() { // foo(); // goo(); std::cout << "cAPI1 rc = " << cAPI1() << std::endl; std::cout << "cAPI2 rc = " << cAPI2() << std::endl; return 0; }Reference http://exceptionsafecode.com/
沒有留言:
張貼留言