29 августа 2014 г.

Частая ошибка №9: Избегание исключений. Перевод.

Оглавление

C# продолжает следить за безопасностью типов и во время выполнения. Это позволяет вам точнее и быстрее выявлять ошибки, по сравнению с языками типа C++, где ошибка приведения типа может привести к произвольному значению в полях объекта. Тем не менее, программисты могут "разбрасываться" такой замечательной возможностью C#. Они попадают в эту ловушку потому что C# предоставляет два различных пути для приведения: один из них бросает исключение, а другой - нет. Некоторые избегают варианта с исключениями, полагая что не имея блока try/catch они экономят немного кодирования.
Для примера у нас здесь два различных варианта явного приведения типа в C#:


Самая очевидная ошибка, которая может возникнуть при использовании второго метода - не проверить возвращаемое значение. Скорее всего, в конечном итоге это приведет к NullReferenceException, который может появиться гораздо позже, усложняя поиск источника проблемы. В отличии от этого, первый метод сразу выбросит InvalidCastException, делая источник проблемы гораздо более очевидным.

Более того, если вы все же помните о проверке возвращаемого значения во втором методе, что вы собираетесь делать когда вернется null? Является ли ваш метод подходящим местом чтобы сообщить об ошибке? Можете ли вы попробовать что-то еще если приведение выполнить не удалось? Если нет, то выброс исключения - это правильная вещь, которой вы позволяете случится как можно ближе к источнику проблемы.

Вот еще примеры других распространенных пар методов, где один бросает исключение, а другой - нет:


Некоторые программисты настолько "противники исключений", что они автоматически считают лучше тот метод, который не бросает исключения. Конечно, бывают случаи когда это может быть правдой, но в общем это не правильно.

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


вместо:


Тем не менее, было бы неверно считать что метод TryParse - "лучший" метод. Иногда это так, иногда нет. Именно поэтому есть два способа приведения. Используйте правильный подход в зависимости от условий, и помните что исключения определенно могут быть вашими друзьями.

Частая ошибка №10: Накопление предупреждений компилятора
Оригинал

Комментариев нет:

Отправить комментарий