assert
- это не способ обработки исключений, это способ их обнаружения. (Таким образом, описания, которые вы находите, мне кажутся несколько неуместными.) Это, по сути, способ сказать:
Это должно быть правдой. Если это не так, вывести ошибку.
Другое дело, как обрабатывать эту ошибку. Вы можете обработать его прямо здесь, в функции, которая его обнаружила, вы можете обработать его в функции, которая его вызвала, вы можете обработать его на самом верху стека на уровне приложения и т. Д.
Имейте в виду, что существует значительная разница между перехватом исключения (которое является конструкцией используемого языка программирования) и осмысленной обработкой исключения (которое является логической конструкцией, не зависящей от используемого языка). Перехватывайте исключения только в тех случаях, когда вы действительно можете что-то с ними сделать. В противном случае позвольте им перебросить стек в другой код, который может что-то с ними поделать. (Но поскольку assert
не обнаруживает ошибок, он выдает их, его следует использовать именно там, где вы пытаетесь его использовать ... точка, в которой ошибка может быть обнаружена, даже если она не может быть обработано.)
Глядя на вашу попытку использовать assert
, похоже, вы близки. Это не совсем правильное использование:
assert (x > 0) ? "assertion failed" : "assertion passed";
Вы относитесь к assert
как к логическому. А затем, используя оператор ? :
, вы отключаете это логическое значение, чтобы ... ну ... на самом деле ничего не делать. Просто верните строку ("assertion failed"
или "assertion passed"
) в строку кода, которая ничего не делает с этой строкой.
Близко, но не совсем.
Сам assert
делает больше, чем просто проверяет условие. Он реагирует на условие, выдавая ошибку или позволяя продолжить выполнение кода. Он использует оператор :
, но не как часть оператора ? :
. Итак, я думаю, что вы пытаетесь сделать следующее:
assert (x > 0) : "assertion failed";
Это в основном говорит:
x всегда должен быть больше 0. Если это не так, что-то не так. Прекратите что-либо делать и вызовите ошибку.
Это вызовет AssertionError
с сообщением "assertion failed"
(которое, естественно, вы захотите заменить более значимым и полезным сообщением, включая любую полезную информацию времени выполнения об исследуемых значениях, чтобы помочь в отладке).
Затем в другом месте вы бы обработали это AssertionError
и каким-то образом отреагировали на него.
Использование assert
очень похоже на что-то вроде этого, только короче и немного выразительнее для его цели:
if (x <= 0) throw new CustomException("assertion failed");
Как видите, assert
немного чище в том, что он:
- Использует определенное ключевое слово, чтобы привлечь внимание к тому факту, что он проверяет условие с единственной целью проверки предположения. Это может быть
if
, или это может быть ответвление нового пути кода по любой другой причине.
- Выдает конкретную ошибку, которую можно отфильтровать отдельно от других ошибок. Обратите внимание на то, что я использую
CustomException
, чтобы сделать то же самое, но AssertionError
более известен / ожидаемо.
- Использует меньше кода.
- Демонстрирует истинное состояние, в отличие от обратного или ложного. В большинстве случаев истинное условие легче читать и более четко выражает намерения кода.
- Следует условности и более идиоматичен.
- Устанавливает код отдельно от остального кода как предназначенный для определенной цели, указывая другим разработчикам, что утверждение должно быть только утверждением. (Таким образом, другим разработчикам не следует изменять его как второй путь кода, возможно, добавляя побочные эффекты к утверждению.)
- Может быть очень легко включен или выключен глобально для запущенного приложения. Java позволяет включать или отключать проверку утверждений в любом заданном контексте времени выполнения. Это очень удобно для глобального управления утверждениями как сквозной задачей.
person
David
schedule
04.11.2012