Тщательное использование выражений "if" или блоков "try/catch"?

Дайте мне некоторые мысли о том, что является лучшей практикой кодирования/делает более эффективный код/​​выглядит красивее/безотносительно: увеличение и улучшение вашей способности использовать, если утверждения предвосхищают и улавливают потенциальные проблемы? Или просто эффективно использовать try/catch в целом?

Скажем, это для Java (если это имеет значение).

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

Ответ 2

if блоки немного быстрее; если вам не понадобится дюжина из них, это лучшая идея, чем try/catches. Исключения должны быть исключительными, а не каждый раз, когда выполняется код. Я использую Исключения для редких событий, таких как отключение сервера (хотя они происходят несколько раз в день) и if блоки для любой из моих контролируемых переменных.

Ответ 3

Независимо от того, какой код вы пишете, вы в конечном итоге используете оба. Я не могу говорить для среды выполнения Java, но в среде выполнения .NET есть производительность, связанная с использованием блоков try-catch. В результате я пытаюсь использовать их только в тех областях, где у меня есть четкий способ обработать исключение, однажды пойманное (даже если он просто регистрирует существование проблемы).

Если вы обнаружите, что используете много блоков try-catch или if-else в вашем коде, или ваши методы имеют тенденцию быть довольно длинными, подумайте о том, как преобразовать код в большее количество меньших методов. Цель вашей логики будет легче следовать - а также проще unit test.

Ответ 4

Я думаю, если утверждения будут лучше. Вы не можете окружать каждую строку кода с помощью try..catch(ну, вы можете, но не должны этого делать). Вы можете окружить блок кода с помощью try catch, но не каждой строки.

И исключения замедляют работу.

Ответ 5

My 2p: Лучше всего использовать try/catch:

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

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

Ответ 6

Из того, что мне рассказали более опытные разработчики и аналитики, try/catch более объектно ориентирован, а если более процедурный.

Мне лично все равно.

Я знаю, что попытка/улов медленнее и приводит к поражению производительности, но если я собираюсь использовать дюжину ifs для проверки, прежде чем я смогу сделать то, что хочу, я всегда буду использовать try/catch, чтобы сохранить количество строк кода.

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

Иногда я, очевидно, включаю некоторые операторы if в try/catch, но в любом случае.

Я использую if, если для проверки (1 или 2) существует только небольшое количество вещей, прежде чем делать то, что мне нужно сделать.

Ответ 7

Там одна вещь, о которой здесь не упоминалось.

При выполнении инструкции if-else каждый раз, когда выполняется код, гарантируется, что оценивается не менее 1 условия. Я уверен, что мы все знаем, как работает if-else-elseif, но чтобы быть ясным... часть выражения if всегда будет оцениваться, если она ложна, а затем else-if и т.д., пока остается только else.

Таким образом, использование инструкции if-else повлияет на вашу производительность. Не значительно (в большинстве случаев), но для выполнения оценок требуется время процессора.

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

Кроме того, это не улов, вызывающий удар производительности, а бросок.

И одним важным моментом является то, что инструкции try-catch никогда не должны использоваться для условной логики. Они должны использоваться только для того, для чего они предназначены: обработка исключений!

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

Как правило, хорошая идея иметь обработчик исключений на абсолютном верхнем уровне вашего приложения, чтобы перехватывать исключения, прежде чем они будут видны пользователю. В ASP.NET вы можете сделать это в событии Application_Error для global.asax. В других языках/средах вы делаете это в своем основном цикле, что бы это ни было.

Но обратите внимание, что есть некоторые исключения, которые всегда лучше всего оставлять невостребованными. Иногда, когда происходит исключение, это индикатор того, что состояние вашего приложения сильно скомпрометировано и ему нельзя доверять. Единственное, что нужно сделать, это убить и перезапустить.

Ответ 8

@PersonalPerson - Извините, но это всего лишь ленивое кодирование. Вместо использования try-catch, потому что слишком много операторов if, почему бы не реорганизовать ваш код (т.е. Поместите свою логику проверки в свой собственный метод). Это позволит вашему коду быть более чистым и читаемым и поддерживать лучшие методы производительности.

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

Клянусь, я раньше работал с вашим кодом, и у меня была боль в голове.

Ответ 9

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

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

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