【问题标题】:c++ design question try catchc++设计问题try catch
【发布时间】:2011-07-04 11:33:43
【问题描述】:

我有以下代码,其中 dbh 构造函数可能会引发异常。我的问题是,dbh 是在 try 块中声明的。抓到后能用吗?如果是,是否还有其他范围解析不同于 {} 的例外情况?如果不是,最好的设计方案是什么?

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;
}

【问题讨论】:

    标签: c++ exception scope-resolution


    【解决方案1】:

    抓到后还能用吗?

    没有。它将在声明它的块的末尾被销毁,就像任何其他局部变量一样。

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

    最好的设计方案是什么?

    try 块之外声明dbh 或将所有使用它的代码移到try 块中。哪一个最有意义取决于您的具体用例。

    在一些相关的说明中,如果您catch (...),您应该重新抛出异常或终止应用程序:您不知道正在处理什么异常,并且通常您不知道继续执行是否安全。

    【讨论】:

    • 我建议你在这里使用第一个选项,除非使用 dbh 的代码量非常少。您可能需要使用更多的 try 块,但及早捕获异常并专门捕获它们对于安全编码至关重要。 :)
    • @Dennis:也许吧。如果您有一系列需要成功完成的任务,则在更高级别处理故障可能会更容易。这是使用异常处理错误的一个主要优势:您可以在最有意义的任何地方处理错误。
    • 得到了答案。谢谢.. 我试图找到简化 API 和错误检查之间的最佳选择
    • “一般来说你不知道继续执行是否安全” - 两种可能性 - dbhandler 是异常安全的,或者不是。如果是这样,那么它对catch(...) 有点模糊,但dbhandler 文档可能同样模糊,我们的程序可能会很高兴地在不处理数据库的情况下以有限的功能运行。如果dbhandler 至少基本上不是异常安全的,那么 破坏了我们的程序并不是严格的我们的 错误。不过,我同意我们不必catch(...),如果只是因为 dbhandler 不应该抛出非std::exception 异常。
    • 我想知道导致这种恐惧和不确定性的异常是什么——如果在 C 程序中看到if init_dbhandler(&amp;dbh, blah, blah) != 0 { return false; },你可能会想,“嗯,这个函数可能应该向上传播错误,而不是仅仅返回一个是/否的答案,假设 init_dbhandler 像其他人一样使用 errno”,但您通常不会认为“啊!我们应该 abort,程序可能处于未定义状态,因为某些事情失败了!” ;-)
    【解决方案2】:

    根据你的函数代码,这样写很有意义:

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

    【讨论】:

    • 这将在 catch 语句被命中之前返回 - 在此实现中进行任何错误检查都是没有意义的。
    • @RageD:你什么意思?如果try 块中的任何代码引发异常,则将检查catch 处理程序。
    • 返回 FAIL 或任何可能需要的结果。
    • @James:啊,是的,我反应很仓促——忽略我说的话(对不起,我当时正在出门)。
    猜你喜欢
    • 1970-01-01
    • 2011-02-23
    • 2011-11-28
    • 1970-01-01
    • 2011-08-26
    • 2011-01-24
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多