Подтвердить что ты не робот

Когда использовать assert() и когда использовать try catch?

В каких ситуациях вы их используете?

4b9b3361

Ответ 1

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

Утверждения для улавливания недействительного кода, то есть проверка наличия инварианта в функции, проверка того, вызван ли внутренний метод с правильными аргументами (для общедоступного API вы все еще можете получить исключение), и т.д.

Это мои основные рекомендации, но соглашения варьируются от ситуации к ситуации и от языка к языку.


Когда вы сомневаетесь, вы можете спросить себя: есть ли конкретная проверка безопасности, которая должна оставаться там в коде выпуска, после того, как мы проверим и закончим все? Если вы ответите "да, это все еще необходимо", вы, вероятно, хотите исключение. В противном случае вам, вероятно, потребуется утверждение.

Ответ 2

Обычно код assert() не работает в коде выпуска, поэтому он никогда не может заменить стратегию try-catch. Тем не менее мне нравится использовать assert() в тех местах, где выбрасываются исключения. Для меня (как разработчика!) Часто бывает проще получить сообщение assert() в строке отказа, чем через стек исключений.

Ответ 3

Они созданы для разных целей. Assert больше подходит для поиска ошибок, try-catch предназначен для обработки исключительных ситуаций.

Ответ 4

Ситуации try-catch и assert совершенно разные. Утверждение используется для проверки того, ожидалось ли значение, которое вы получили, как параметр. Я бы не рекомендовал использовать assert в производственном коде, он используется в unit-test в основном и редко для проверки параметров. Чтобы проверить пройденные значения, лучше использовать что-то вроде:

public void test(int i) {
  if (i < 0) {
    throw new IllegalArgumentException("i cannot be less than 0");
  }
  ...
}

Блок try-catch используется, когда вы знаете, что что-то внутри блока может пойти не так. Например, вы пишете на SD-карту, и нет места для записи. Или, случалось, вы пытаетесь прочитать массив из его границ. Затем вы помещаете свой критический код в блок try-catch и проверяете excpetions:

try {
  InputStream is = new FileInputStream("filename.txt");
  ...
} catch FileNotFoundExcpetion {
  System.out.println("file not found");
} finally {
 ...
}

Подробнее об исключениях и блоках try-catch.