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

时间:2014-11-04 18:39:31

标签: vala gsettings

我在Vala应用程序中使用Glib.Settings。我想确保即使模式或密钥不可用,我的程序也能正常工作。所以我添加了一个try / 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) 所以你能告诉我我错在哪里吗?

2 个答案:

答案 0 :(得分:2)

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

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

Vala只检查了异常,因此,与C#不同,方法必须声明它将抛出,否则无法执行此操作。您可以随时仔细检查Valadoc或VAPI以查看。

答案 1 :(得分:1)

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