【问题标题】:How to handle errors while using Glib.Settings in Vala?在 Vala 中使用 Glib.Settings 时如何处理错误?
【发布时间】:2023-03-02 23:05:01
【问题描述】:

我在我的 Vala 应用程序中使用 Glib.Settings。而且我想确保即使架构或密钥不可用,我的程序也能正常工作。所以我添加了一个 try/catch 块,但如果我使用不存在的密钥,程序会出现段错误。据我了解,它甚至没有达到 catch 语句。 这是使用设置的函数:

GLib.Settings settings;
string token = "";
try 
{
    settings = new GLib.Settings (my_scheme);
    token = settings.get_string("token1");
}
catch (Error e) 
{
    print("error");
    token = "";
}
return token;

而程序输出为:

(main:27194): GLib-GIO-ERROR **: Settings schema 'my_scheme' does not contain a key named 'token1'
Trace/breakpoint trap (core dumped)

(当然我使用的是我的真实方案字符串而不是 my_scheme) 那么你能建议我哪里错了吗?

【问题讨论】:

    标签: vala gsettings


    【解决方案1】:

    GLib.Settings 中的方法,包括get_string 不抛出异常,它们在库内部调用abort。这不是一个理想的设计,但您无能为力。

    在这种情况下,正确的做法是修复架构,安装到 /usr/share/glib-2.0/schemas 并在该目录上运行 glib-compile-schemas(以 root 身份)。

    Vala 只有已检查的异常,因此,与 C# 不同,方法必须声明它将抛出,否则不可能这样做。您可以随时仔细检查 Valadoc 或 VAPI 以查看。

    【讨论】:

    • 我有正确的架构,我只是想确保有人没有删除我的密钥或架构,并且我的程序在此之后不会出现段错误。
    【解决方案2】:

    我知道这已经很晚了,但我一直在寻找相同的解决方案,所以我想我会分享一个。正如@apmasell 所说,GLib.Settings 方法不会抛出异常——它们只是中止。

    但是,您可以执行SettingsSchemaSource.lookup 以确保密钥首先存在。然后,您还可以将has_key 用于特定键。例如,

    var settings_schema = SettingsSchemaSource.get_default ().lookup ("my_scheme", false);
    if (settings_schema != null) {
        if (settings_schema.has_key ("token1")) {
            var settings = new GLib.Settings ("my_scheme");
            token = settings.get_string("token1");
        } else {
            critical ("Key does not exist");
        }
    } else {
        critical ("Schema does not exist");
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 2013-09-16
      • 2019-06-23
      • 1970-01-01
      相关资源
      最近更新 更多