Зачем использовать исключение вместо if ... else - PullRequest
3 голосов
/ 17 ноября 2011

Например, в случае исключения «Индекс массива вне границ», почему бы нам не проверить длину массива заранее:

 if(array.length < countNum)
 {
 //logic
 }
 else
 {
 //replace using exception
}

Мой вопрос: почему вы решили использовать исключение? и когда использовать исключение вместо if-else

Спасибо.

Ответы [ 6 ]

2 голосов
/ 17 ноября 2011

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

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

2 голосов
/ 17 ноября 2011

Это зависит от приемлемой практики для данного языка.

В Java принято всегда проверять условия, когда это возможно, и не использовать исключения для управления потоком. Но, например, в Python допустимо не только использование исключений таким образом, но и предпочтительная практика.

1 голос
/ 17 ноября 2011

Вот пример, где на самом деле было бы лучше использовать исключение вместо условного.

Скажем, у вас был список из 10000 строк.Теперь вам нужны только те элементы, которые являются целыми числами.Теперь вы знаете, что очень небольшое их количество не будет целым числом (в виде строки).Так стоит ли проверять, является ли каждая строка целым числом, прежде чем пытаться преобразовать их?Или вы должны просто попытаться преобразовать их и сгенерировать и поймать исключение, если вы получите одно, которое не является целым числом?Второй способ более эффективен, но если бы они были в основном нецелыми, то было бы более эффективно использовать оператор if.

В большинстве случаев, однако, вы не должны использовать исключения, если вы можете заменитьих с условным.

0 голосов
/ 11 августа 2018

Как кто-то уже сказал, «Исключения» в языках программирования предназначены для исключительных случаев, а не для настройки логического потока вашей программы.Например, в случае данного фрагмента кода вашего вопроса, вы должны увидеть, каково намерение включающего метода или функции.Проверяет array.length < countNum часть бизнес-логики или нет.Если да, то если поставить пару if/else, есть путь.Если это условие не является частью бизнес-логики и намерение включающего метода является чем-то другим, тогда напишите код для этого чего-то еще и выведите исключение вместо того, чтобы идти по пути if/else.Например, вы разрабатываете приложение для школы, и в вашем приложении есть метод GetClassTopperGrades, который отвечает за часть бизнес-логики, которая требует вернуть проходные баллы учащегося с наивысшими оценками в определенном классе.определение метода / функции будет выглядеть примерно так:

int GetClassTopperGrades(string classID)

В этом случае целью метода является возвращение оценок для действительного класса, который всегда будет положительным целым числом, согласно бизнес-логикеприложения.Теперь, если кто-то вызывает ваш метод и передает строку мусора или null, что он должен делать?If должен выдать исключение, например, NullReferenceException или 'InvalidArguementException', потому что это был исключительный случай в данном конкретном контексте.В методе предполагалось, что всегда будет передан действительный идентификатор класса, а NULL или пустая строка НЕ ​​является действительным идентификатором класса (отклонение от бизнес-логики).

Кроме того, в некоторых условиях есть нет предварительных знаний о результатах данного кода и нет определенного способа предотвращения исключительной ситуации .Например, при запросе к некоторой удаленной базе данных, если сеть выходит из строя, у вас нет никакой другой опции, кроме выдачи исключения.Вы бы проверили сетевое соединение перед выполнением каждого SQL-запроса к удаленной базе данных?

0 голосов
/ 14 ноября 2017

Существует веская и неоспоримая причина, по которой следует использовать исключения - независимо от языка. Я твердо верю, что решение о том, использовать ли исключения или нет, не имеет никакого отношения к конкретному используемому языку.

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

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

0 голосов
/ 17 ноября 2011

Есть много ответов на этот вопрос. Например, из Java, когда вы используете несколько потоков, иногда вам нужно прервать поток, и поток увидит это, когда возникнет исключение InterruptedException.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...