4

我在我的 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)所以你能建议我哪里错了吗?

4

2 回答 2

2

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

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

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

于 2014-11-04T22:29:06.283 回答
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");
}
于 2019-01-21T18:51:26.997 回答