Как обрабатывать ошибки при использовании 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");
}
Другие вопросы по тегам