Assert VS Exception

Не пойму все же, когда следует использовать первое, а когда второе. Например, в статье http://habrahabr.ru/post/141080/ активно используются ассерты для проверки входных значений, однако, в пхп документации http://php.net/manual/ru/function.assert.php сказано, что лучше этого не делать, т.к. асерты легко отключить. Так когда же использовать?
В то же время конструкции вроде
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }
if ( !is_string($value) ) {
throw new Exception( "Value $value must be a string"  );
}

использовать везде надоедает, можно, конечно вынести ее в отдельный клас Assert или Condition.

1 ответов


assert - Исключительно отладочная штука, применяемая в процессе разработки. PHP - язык с автоматической контекстной типизацией данных. Чтобы быть уверенным на этапе разработки в том, что контекст интерпретации данных в определенных местах кода тот, что нужно, используется assert. Для валидации данных он не подходит. Потому, что он проверяет не валидность содержимого переменной, а соответствие контекста интерпретации, заявленному типу.


По логике, ассерт означает утверждение, которое должно выполняться для того, чтобы дальнейший код имел смысл. То есть если ассерт (утверждение) не является истинным, то бросается исключение. AssertionError или что-то такое. Суть в том, чтобы не отлавливать это событие, а просто убедиться, что в коде ошибка и поправить ситуацию (найти причину ошибки).
Исключение же, является вполне рациональной, хоть и исключительной ситуацией. Исключение означает, что в коде возникла ситуация, которая требует особой обработки, в обход основного потока выполнения. Такое исключение отлавливаемо (и должно быть отлавливаемо). Например, у нас есть итератор. Когда он кончится будет выброшено исключение типа "дошли до конца". Это особая ситуация, которая означает, что пора выйти из итеративного цикла.

Пытайтесь прикидывать каждую ситуацию по типам "проверка корректности дальнейшего кода" и "ситуация, которую лень обрабатывать в ветке if, потому как она сильно искажает структуру кода".


1. Утверждения должны выполняться всегда. Если утверждение не выполнилось, то значит программист что-то не доглядел. В PHP assert - это модифицированный eval, поэтому не рекомендуется его использовать на боевом сервере.
2. Исключения будут возникать: упала база, не смогли открыть удалённый хост, ошибка формата данных и т.д. И, чтобы пользователь не получил белый лист или что-то в этом духе, надо исключение обработать.