Когда использовать assert () и когда использовать try catch? - PullRequest
17 голосов
/ 02 декабря 2010

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

Ответы [ 4 ]

15 голосов
/ 02 декабря 2010

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

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

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


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

5 голосов
/ 02 декабря 2010

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

2 голосов
/ 02 декабря 2010

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

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

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

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

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

2 голосов
/ 02 декабря 2010

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

...