如何在Vala中使用Glib.Settings时处理错误



我在我的Vala应用程序中使用Glib.Settings。我想确保我的程序即使在模式或密钥不可用的情况下也能正常工作。所以我添加了一个try/catch块,但如果我使用的是不存在的密钥,则程序segfault。据我所知,它甚至没有达到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)

(当然,我使用的是真正的scheme字符串,而不是my_scheme)你能告诉我哪里错了吗?

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

在这种情况下,正确的做法是修复您的模式,安装到/usr/share/glib-2.0/schemas中,并在该目录上运行glib-compile-schemas(作为根目录)。

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

我知道这太晚了,但我正在寻找相同的解决方案,所以我想分享一个。正如@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");
}

相关内容

  • 没有找到相关文章