Как обрабатывать ошибки при использовании Glib.Settings в Vala?
Я использую Glib.Settings в своем приложении Vala. И я хочу убедиться, что моя программа будет работать нормально, даже если схема или ключ недоступны. Итак, я добавил блок 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). Итак, вы можете подсказать мне, где я не прав?
1 ответ
Методы в GLib.Settings
, в том числе get_string
не бросайте исключения, они называют abort
внутри библиотеки. Это не идеальный дизайн, но вы ничего не можете с этим поделать.
В этом случае правильная вещь - это исправить вашу схему, установить в /usr/share/glib-2.0/schemas
и беги glib-compile-schemas
в этом каталоге (как root).
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");
}