我在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) 所以你能告诉我我错在哪里吗?
答案 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");
}