Необработанные исключения
Avalonia не предлагает никакого механизма для глобальной обработки исключений и пометки их как обработанных. Причина в том, что нельзя знать, правильно ли было обработано исключение, и поэтому приложение может находиться в недопустимом состоянии. Вместо этого настоятельно рекомендуется обрабатывать исключения локально, если они могут быть обработаны вашим приложением. Тем не менее, по-прежнему рекомендуется регистрировать любое необработанное исключение для дальнейшей поддержки и отладки.
Логгирование
Мы рекомендуем регистрировать исключения в консоли, файле или где-либо еще. Доступно несколько библиотек ведения журналов, например Serilog и NLog.
Глобальные try-catch
Вы можете поймать любое исключение из основного потока, который также является потоком пользовательского интерфейса в Avalonia, в вашем файле Program.cs. Для этого мы просто обернем весь void Main в блок try и catch. В блоке catch вы можете зарегистрировать ошибку, сообщить пользователю, отправить файл журнала или перезапустить приложение.
// File: Program.cs public static void Main(string[] args) { try { // prepare and run your App here BuildAvaloniaApp() .StartWithClassicDesktopLifetime(args); } catch (Exception e) { // here we can work with the exception, for example add it to our log file Log.Fatal(e, "Something very bad happened"); } finally { // This block is optional. // Use the finally-block if you need to clean things up or similar Log.CloseAndFlush(); } }
Исключения из другого потока
Если вы используете Task
для асинхронного выполнения какой-либо работы, вы можете настроить TaskScheduler.UnobservedTaskException
. Для получения дополнительной информации прочитайте документацию Microsoft .NET.
Исключения из реактивного пользовательского интерфейса
Если вы используете Avalonia вместе с ReactiveUI, вы можете подписаться на их RxApp.DefaultExceptionHandler
. Для получения дополнительной информации см. Обработчик исключений ReactiveUI по умолчанию.
Обратите внимание, что RxApp.DefaultExceptionHandler
должен быть установлен до создания какой-либо ReactiveCommand. В противном случае пользовательский обработчик не будет использоваться. Вы можете установить его в точке входа вашего приложения или перед созданием любого представления или окна Avalonia.