我在我的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");
}