问题描述
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::exception
或Gtk::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 ++,您会丢失异常消息。