可以从资源创建 Gtk::Builder 而不实现 try/catch 块吗?

Is it OK to create Gtk::Builder from resource without implementing try/catch block?

Gtk::Builder::create_from_resource() 在出现问题时抛出以下异常,例如找不到资源文件或 Glade/UI 文件中存在标记错误等

但我无意在我的 GTKMM 程序中处理这些异常并做其他事情。

以防万一,如果我必须按照良好的编程习惯实施 try/catch 块,基本代码如下所示:

try {
    auto resource = Gtk::Builder::create_from_resource("/domain/reverse/myappid");
} catch (const Gio::ResourceError &ex) {
    cerr << ex.what();
} catch (const Glib::MarkupError &ex) {
    cerr << ex.what();
} catch (const Gtk::BuilderError &ex) {
    cerr << ex.what();
}

如果其中任何一个被抛出,我只是打印相同的异常消息...但无论如何,即使没有实现 try/catch 块,我仍然会得到相同的有意义的消息。在这两种情况下,程序都会 运行 正常,没有应用程序崩溃的意图。只是为开发人员打印在控制台上的信息。

那么在没有 Gtk::Builder::create_from_resource 的 try/catch 块的情况下编写更少且可读的代码是否安全?

如果您真的不想处理异常,如果抛出某些异常,程序会突然终止

我个人更喜欢在这些情况下使用 global exception handling。在您的情况下,所有异常都来自 std::exceptionGtk::BuilderError,因此您的处理程序可能如下所示:

int main()
{
    try
    {
        // Program code, eventually a call to `Gtk::Builder::create_from_resource`.
    }
    catch(const std::exception& p_exception)
    {
        cerr << p_exception.what();
    }
    catch(const Gtk::BuilderError& p_exception)
    {
        cerr << p_exception.what();
    }

    return 0;
}

我喜欢这个的一点是,我不必在任何地方都放置 try-catch 块来处理我无意处理的异常(例如:用户以某种方式删除了资源文件),但我可以出于调试目的记录一些东西,或者警告用户而不是简单地崩溃(即终止)。

您也可以使用 catch-all 语法:

int main()
{
    try
    {
        // Program code, eventually a call to `Gtk::Builder::create_from_resource`.
    }
    catch(...)
    {
        // Do something, but the exception message is not available.
    }

    return 0;
}

这有捕获一切的优点(即使不是 std::exception 的子 类 的异常),但缺点是你丢失了异常消息,至少对于标准 C++ 是这样。