Глобальный обработчик try catch для всех асинхронных методов ожидания веб-API.

Я знаю, что оператор await чист, и если его использовать с async/await до конца, он будет правильно генерировать исключения.

У меня есть множество вызовов API (веб-API), написанных в контроллерах, которые полностью используют асинхронное ожидание. Есть ли способ написать общий try catch для всех этих асинхронных методов ожидания или мне нужно найти более сложный способ добавить try catch в каждый из этих методов API для обработки всех необработанных исключений.


person Raghav    schedule 28.04.2019    source источник
comment
Зачем вам нужен «глобальный обработчик try catch»? Как вы думаете, какую проблему это решит?   -  person Dour High Arch    schedule 29.04.2019
comment
Мне нужен общий try catch, как метод ApplicationOnError Global.asax, чтобы можно было написать общую логику.   -  person Raghav    schedule 29.04.2019


Ответы (1)


Вы можете написать фильтр исключений.

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

person Stephen Cleary    schedule 29.04.2019
comment
Спасибо. Я знал, что ты придешь и спасешь мир от застревания в проблемах с асинхронным ожиданием :) - person Raghav; 29.04.2019
comment
Я застрял с другой проблемой, которую я опубликовал два дня назад stackoverflow.com/questions/55836889/ Поскольку я не получил никаких указателей, я планирую полностью удалить Task.Run и Thread.Startnew в моем Проект ASP.NET. Я чувствую, что это может быть причиной этой проблемы. - person Raghav; 29.04.2019
comment
Я просмотрел вашу статью stackoverflow.com/questions/33764366/ и получил это Вот почему один из принципов ASP.NET - избегать использования потоков пула потоков ( за исключением потока запросов, который предоставляет вам ASP.NET, конечно). Более того, это означает, что приложения ASP.NET должны избегать Task.Run. Это заставило меня решить удалить Task.Run и Thread.StartNew из всего приложения ASP.NET. - person Raghav; 29.04.2019
comment
Будет ли этот фильтр работать, если у меня есть несколько ожиданий в одном асинхронном методе? Что, если первые методы await генерируют исключение, пока выполняется вторая задача await? Где будет обрабатываться второе исключение await Task? - person Raghav; 01.05.2019
comment
@Raghav: фильтр работает для любых исключений, распространяемых методом действия. Чтобы распространять исключения, все задачи должны (в конечном итоге) быть awaited методом действия. - person Stephen Cleary; 01.05.2019