可以从资源创建 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 文件中存在标记错误等
- 生成器错误
- 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++ 是这样。
Gtk::Builder::create_from_resource()
在出现问题时抛出以下异常,例如找不到资源文件或 Glade/UI 文件中存在标记错误等
- 生成器错误
- 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++ 是这样。