Search code examples
c++exceptionscope-resolution

c++ design question try catch


I have the following code in which dbh constructor may throw exception. The question I have is, dbh is declared inside try block. Will it be available after the catch? If yes, are there any other exceptions where the scope resolution is different than {} ? If not, what is the best design alternative?

status func(const char* field, char** value)
{
    try {
        dbhandler<recType> dbh(("dbName"),("table"));
    }
    catch (std::runtime_error &e) {
        LOG_ERR << e.what() << endl ;
        return false;
    }
    catch (...) {
        LOG_ERR << "Unknown exception" << endl ;
        return false;
    }

    rc = dbh.start("key",field, val);
    return rc;
}

Solution

  • Will it be available after the catch?

    No. It will be destroyed at the end of the block in which it is declared, just like any other local variable.

    try {
        dbhandler<recType> dbh(("dbName"),("table")); 
    }   // dbh.~dbhandler<recType>() is called to destroy dbh
    

    What is the best design alternative?

    Declare dbh outside of the try block or move all the code that uses it into the try block. Which one makes the most sense depends on your specific use case.

    On a somewhat related note, if you catch (...), you should either rethrow the exception or terminate the application: you have no idea what exception is being handled and in general you have no idea whether it is safe to continue executing.