Я только что узнал, что .NET 4.5 представил изменение в том, как Task
обрабатываются исключения внутри . А именно они тихо подавлены.
Официальное обоснование того, почему это было сделано, выглядит так: «Мы хотели быть более дружелюбными к неопытным разработчикам»:
В .NET 4.5 задачи имеют значительно большее значение, чем в .NET 4, поскольку они встроены в языки C # и Visual Basic как часть новых асинхронных функций, поддерживаемых этими языками. По сути, это выводит Задачи из сферы опытных разработчиков в сферу деятельности каждого. В результате это также приводит к новому набору компромиссов в отношении того, насколько строгой должна быть обработка исключений.
( источник )
Я научился верить, что многие решения в .NET были приняты людьми, которые действительно знают, что они делают, и, как правило, есть веская причина, по которой они решают. Но этот ускользает от меня.
Если бы я проектировал свою собственную библиотеку асинхронных задач, в чем преимущество проглатывания исключений, которые разработчики Framework увидели, которых я не вижу?
Ответы:
Что бы это ни стоило, документ, на который вы ссылаетесь, дает пример в качестве оправдания:
Я не убежден в этом. Он устраняет возможность однозначной, но трудно отслеживаемой ошибки (таинственный сбой программы, который может произойти спустя много времени после фактической ошибки), но заменяет ее возможностью полностью тихой ошибки - которая может стать столь же трудной для отслеживания проблемы позже. в вашей программе. Это кажется сомнительным выбором для меня.
Поведение настраивается - но, конечно, 99% разработчиков просто собираются использовать поведение по умолчанию, никогда не задумываясь об этой проблеме. Так что то, что они выбрали по умолчанию, имеет большое значение.
источник
op1
, не так ли? Если что один остается необработанным, он будет валить процесс, не так ли?op1
исключение, ниop2
исключение не приведут к срыву программы. Преимущество в том, что у вас есть возможность наблюдать за обоими. Но если вы этого не сделаете, они оба будут проглочены. Хотя я могу ошибаться.TL; DR - Нет , вы не должны просто тихо игнорировать исключения.
Давайте посмотрим на предположения.
Без сомнения, у MS есть действительно блестящие люди. У них также есть ряд менеджеров и руководителей, которые ... невежественны и постоянно принимают плохие решения. Как бы нам ни хотелось верить сказке о технически подкованном ученом, ведущем разработку продукта, реальность гораздо мрачнее.
Суть в том, что если ваш инстинкт говорит вам, что что-то может быть не так, то есть хороший шанс (и прошлый прецедент), что это неправильно.
Как обрабатывать исключения в этом случае является решением человеческого фактора, а не техническим решением. Проще говоря, исключением является ошибка. Сообщение об ошибке, даже если она плохо отформатирована, предоставляет важную информацию конечному пользователю. А именно, что-то пошло не так.
Рассмотрим этот гипотетический разговор между конечным пользователем и разработчиком.
Наш бедный, к счастью, гипотетический разработчик теперь должен выяснить, что пошло не так в цепочке событий. Где оно было?
Уведомление обработчика события -> Процедура обработки события -> Метод, инициируемый обработчиком -> Начало асинхронного вызова -> 7 уровней сети OSI -> Физическая передача -> Резервное копирование 7 уровней сети OSI -> Служба получения -> метод, вызываемый службой -> ... -> возвращаемый ответ, отправленный службой -> .... -> асинхронная квитанция -> обработка асинхронного ответа -> ...
И, пожалуйста, обратите внимание, что я замял несколько возможных путей ошибок там.
После рассмотрения некоторых базовых предположений, я думаю, становится более понятным, почему тихое подавление исключений - плохая идея. Исключение и связанное с ним сообщение об ошибке являются ключевым показателем для пользователей, что что-то пошло не так. Даже если сообщение не имеет смысла для конечного пользователя, встроенная информация может быть полезна для разработчика, чтобы понять, что пошло не так. Если им повезет, сообщение даже приведет к решению.
Я думаю, что отчасти проблема заключается в том, что неправильно обработанное исключение приведет к сбою вашего приложения. Подавляя исключения, приложение не будет аварийно завершать работу. В этом есть некоторая обоснованность, поскольку суть асинхронности заключается в том, чтобы позволить приложению продолжать работать во время извлечения данных. Не слишком логично говорить, что если вы могли бы продолжать работать, ожидая результатов, то сбой при извлечении также не должен приводить к сбою приложения - асинхронный вызов неявно объявляется как недостаточно важный для завершения приложения.
Так что это решение, но оно решает не ту проблему. Не требуется много усилий, чтобы предоставить оболочку для обработки исключений, чтобы приложение могло оставаться запущенным. Обнаружено исключение, сообщение об ошибке выдается на экран или регистрируется, и приложение может продолжать работать. Подавление исключения подразумевает, что игнорирование ошибок будет в порядке, и что ваше тестирование гарантирует, что исключения все равно никогда не попадут в поле.
Таким образом, моя окончательная оценка заключается в том, что это несостоятельная попытка решить проблему, созданную путем подталкивания людей к асинхронной модели, когда они не были готовы переключить свое мышление на такой подход.
источник