Как обрабатывать исключения в асинхронном коде с Caliburn.Micro - PullRequest
0 голосов
/ 16 июня 2019

У меня есть кнопка в моем представлении <Button Content="Search" cal:Message.Attach="SearchAsync"/>, которая вызывает функцию, которая вызывает исключение.Я пытаюсь перехватить это исключение в моем классе Bootstrapper с помощью

protected override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
    e.Handled = true;
    e.Exception.Log();
}
  • Если функция выглядит следующим образом: public async Task SearchAsync() ошибка просто проглатывается и исключение OnUnhandledException никогда не достигается,
  • если функция выглядит следующим образом: public async void SearchAsync() она выдает исключение, но отладчик останавливается и ждет, пока я нажму "продолжить" в функции void, и мне нужно создать функцию void для каждой функции Task и
  • если я использую AsyncReactiveCommand , он может перехватить исключение в OnUnhandledException, но использование команды снова приводит к дополнительному коду (SearchCommand = new AsyncReactiveCommand().WithSubscribe(async () => await SearchAsync());).

Насколько я понялasync void следует использовать для действий, потому что они являются обработчиками событий (источник) .

Решения, которые я придумала, таковы: либо используйте команду, либо оберните функцию Task в try / catchЯ не очень доволен этим.

Как правильно работать с асинхронным режимом и ждать в Caliburn.Micro и при этом использовать cal: Message.Attach = "xyz" синтаксис?

Предпочтительно я хотел бы использовать синтаксис асинхронной задачи без чего-либо еще, потому что он обеспечивает наилучшую возможность тестирования и требует наименьшего количества кода.

1 Ответ

0 голосов
/ 17 июня 2019

Как правильно работать с асинхронным режимом и ожидать в Caliburn.Micro и при этом использовать синтаксис cal: Message.Attach = "xyz"?

Вы должны поймать исключение в xyz:

public async Task xyz()
{
    try
    {
        //...
    }
    catch (Exception ex)
    {
        //handle...
    }
}

Если вы хотите обрабатывать это глобально в OnUnhandledException загрузчика, вам следует изменить тип возвращаемого значения с Task на void. Методы, возвращающие Task, рассматриваются как сопрограммы.

...