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

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

4 ответов


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

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

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


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


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


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


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

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

блок Try-catch используется, когда вы знаете, что что-то внутри блока может пойти не так. Например, вы пишете на sdcard и нет места для письма. Или случилось так, что вы пытаетесь прочитать массив за его пределами. Тогда, вы положите вашу критический код в попробовать-catch блок и проверить excpetions:

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

больше об исключениях и блоках try-catch.