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

问题描述

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

  • BuilderError
  • Glib :: MarkupError
  • Gio :: ResourceError

但是我无意处理这些异常并在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 ++,您会丢失异常消息。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...