Когда бросать исключения - PullRequest
0 голосов
/ 07 января 2019

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

По сути, пользователь "The Digital Gabeg" заявляет, что, если исходная предпосылка кода не соблюдается, выдается ошибка. В приведенном примере метод возвращает true, если длина List <> превышает 50, и false, если нет. Однако если объект, переданный методу, не является List <>, метод не может точно вернуть true или false, поэтому вместо возврата чего-либо он выдает ошибку (хотя, строго говоря, эта логика не совсем точна, если Объект не относится к типу объекта, который имеет члены (то есть, List <> или массив), тогда все равно ложно, что его длина превышает 50 [потому что для того, чтобы иметь длину более 50, ему сначала нужно иметь " длина "определена для объекта]).

Самая очевидная дыра в этом примере состоит в том, что указание параметра метода в качестве List <> позволит избежать возможности передавать что-либо еще методу. Это не совсем мой вопрос, хотя. Ради аргумента, давайте просто предположим, по какой-то причине, что вы не можете гарантировать, что объект, переданный методу, является List <> во время компиляции - даже если бы это было так, такого рода вещи можно обойти, изменив Возвращает тип метода из логического значения в int и указывает возвращаемое значение 0 для false, 1 для true и -1 для всего остального. Это может быть произвольное присвоение значений, но оно обрабатывает ситуацию без необходимости генерировать исключение. Вы могли бы даже заставить его возвращать другие значения, кроме -1, 0 и 1, чтобы представлять другие вещи. Например, если передан массив, а не List <>, вы можете использовать значения 2 и 3 для true и false с предупреждением о том, что в то время как предоставленный объект имел (или не имел) более 50 членов, переданный объект не был строго List <> ...., если такие вещи представлены в документации и / или комментариях.

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

1 Ответ

0 голосов
/ 07 января 2019

В случае, если вы описываете ошибку, определенно лучший вариант. При использовании функции, скажем,

boolean x = listBigEnough(list)

мы можем предположить, как работает функция. Если вместо этого у нас есть

int x = listBigEnough(list)

Мы понятия не имеем, что представляет собой х. Сколько элементов нам нужно добавить в список, чтобы он был достаточно большим? Что означает х = -3? Может быть, мы принимаем 1 = истина 0 = ложь и делаем

if x==0 {
//increase size of list
} else {
//continue as usual
}

Но что произойдет, если возникнет ошибка и listBigEnough вернет -1?

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

list = //user input
try {
  if listBigEnough(list) {
    //do thing
  } else {
   //tell user to get larger list
  }
} catch (NotAListError) {
// tell user to give a list
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...