gpt4 book ai didi

c++ - 是否可以从资源创建Gtk::Builder而不实现try/catch block ?

转载 作者:行者123 更新时间:2023-12-03 07:15:48 26 4
gpt4 key购买 nike

出现问题时,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++,您会释放异常消息。

    关于c++ - 是否可以从资源创建Gtk::Builder而不实现try/catch block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64203072/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com