Зачем нужны throw Exception?

Silentland

Новичок
fisher, приходиться поднимать вопрос через два года. Такой пример: пользователь загружает файл на сервер. Он может не загрузиться потому что превышен размер файла установленный в конфиге сервера, закончилось место на диске, превышено количество разрешенных для загрузки файлов или у файла неверное расширение. Первые две ошибки генерирует движок php, вторые — валидатор. Пользователь же получает однотипные предупреждения типа «файл слишком велик», «файл недопустимого типа». По вашей логике, тут нужно и обычные проверки использовать и эксепшены и все это потом сводить в понятный пользователю вид. И где тут простота?
 

Фанат

oncle terrible
Команда форума
И где тут простота?
Непонятно, к чему было поднимать тему с таким примитивным вопросом.
Про вторую ошибку не уверен - никогда не сталкивался, но первую генерирует не РНР, а валидатор. проверяя код ошибки загрузки.

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

Silentland

Новичок
Копаюсь сейчас во фреймворках, везде все на throw построено, в т.ч. классы валидаторов. Просто не нашел там других способов ловли ошибок или исключений. Означает ли это, что их создатели не понимают как пользоваться этим инструментом?

yii
PHP:
...
else if($error==UPLOAD_ERR_PARTIAL)
    throw new CException(Yii::t('yii','The file "{file}" was only partially uploaded.',array('{file}'=>$file->getName())));
else if($error==UPLOAD_ERR_NO_TMP_DIR)
    throw new CException(Yii::t('yii','Missing the temporary folder to store the uploaded file "{file}".',array('{file}'=>$file->getName())));
else if($error==UPLOAD_ERR_CANT_WRITE)
    throw new CException(Yii::t('yii','Failed to write the uploaded file "{file}" to disk.',array('{file}'=>$file->getName())));
else if(defined('UPLOAD_ERR_EXTENSION') && $error==UPLOAD_ERR_EXTENSION)  // available for PHP 5.2.0 or above
    throw new CException(Yii::t('yii','File upload was stopped by extension.'));
...
zend
PHP:
if (is_string($dirOrIterator)) {
    if (!is_dir($dirOrIterator)) {
        throw new Exception\InvalidArgumentException('Expected a valid directory name');
    }
    $dirOrIterator = new RecursiveDirectoryIterator($dirOrIterator, RecursiveDirectoryIterator::FOLLOW_SYMLINKS);
} elseif (!$dirOrIterator instanceof DirectoryIterator) {
    throw new Exception\InvalidArgumentException('Expected a DirectoryIterator');
}
simfony
PHP:
if (true !== @rmdir($file)) {
    throw new IOException(sprintf('Failed to remove directory %s', $file));
}
...
if (true !== @rmdir($file)) {
    throw new IOException(sprintf('Failed to remove file %s', $file));
}
...
if (true !== @unlink($file)) {
    throw new IOException(sprintf('Failed to remove file %s', $file));
}
 

Ragazzo

TDD interested
Silentland
Скажу по секрету, многие создатели фреймворков и т п вещей вообще не подозревают об их существовании.
 

Фанат

oncle terrible
Команда форума
Означает ли это, что их создатели не понимают как пользоваться этим инструментом?
Вот это -
PHP:
if (true !== @rmdir($file)) {
- вообще АДЪ.

Если ты хотел привести создателей фреймворков в качестве непререкаемых авторитетов, то у тебя получилось наоборот.
 
  • Like
Реакции: craz

Silentland

Новичок
Блин, а кого тогда приводить? С одной стороны создатели фреймворков с тысячными комьюнити, с другой — ведущий программист Баду, Фанат и Ragazzo (про вас абсолютно ничего не знаю). Ну, а с третьей я, кто хочет расширить свои знания в этой области. Самостоятельно никакие исследования провести не могу просто потому, что вся жизнь уйдет, если досконально докапываться до каждой фигни. Вот и остается заручиться мнением авторитетного программера, желательно, специалиста по эксепшенам.

if (true !== @rmdir($file)) { - вообще АДЪ. Так и есть. Всегда поражает, как такое может появиться в проектах с огромным комьюнити. Ну ладно Джумла была бы... Но один из лидирующих фреймворков...
 

itprog

Cruftsman
Фанат
А в чем адовость заключается?

Silentland
Я уверен, что это там не без причины.
 

Silentland

Новичок
Надо писать if (@rmdir($file) !== true) {, т.к. логично переменную сравнивать с константой, а не наоборот. Конечно, если этот код не мастер Йода писал )))
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Надо писать if (@rmdir($file) !== true) {, т.к. логично переменную сравнивать с константой, а не наоборот. Конечно, если этот код не мастер Йода писал )))
http://en.wikipedia.org/wiki/Coding_conventions#Left-hand_comparisons

Это нужно для того, что бы избежать ошибки в виде if($var = true) — что не вызовет никаких ошибок, т.к. является синтаксически правильным выражением, но неверным логически.
 

Фанат

oncle terrible
Команда форума
просто потому, что вся жизнь уйдет, если досконально докапываться до каждой фигни.
Это двойное заблуждение.
Во-первых, не вся. Далеко не вся. Жизнь гораздо больше, чем тебе кажется.
Во-вторых - не "уйдёт". "Уходит" жизнь когда ты смотришь говномультики по 2х2 или бухаешь с пацанами в подъезде.
А когда ты занимаешься делом, то жизнь не уходит. Ты живешь ее с пользой, становясь специалистом. причем изучить все тонкости досконально - это единственный способ стать специалистом, а не говнокодером.
Собственно, этим и отличается один от другого: гонокодер знает, как правильно, а специалист - понимает.
Вот и остается заручиться мнением авторитетного программера, желательно, специалиста по эксепшенам.
К сожалению, вариант "послушать умных пацанов" не проходит.
Потому что, во-первых, чтобы понять ответ, надо что-то знать самому. А во-вторых - there is always more than one way to do it. Нет ЕДИНСТВЕННОГО ПРАВИЛЬНОГО ПОДХОДА НА ВСЕ ВРЕМЕНА. про любой надо думать и прикидывать его осмысленность для твоих задач и ресурсов. К примеру тот же Фишер привел пример корректно построенной на ексепшенах системы. И если тебе хочется все красивенько и академичненько - флаг тебе в руки.

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

В общем, мне, из сказанного ими, собственного опыта и приведенного тобой кода ясно видно, что исключения при обработке формы не годятся.
Желаю тебе, чтобы ты так же мог составить свое мнение, выслушав других, а не тупо искал бы, за кем повторить.
 
  • Like
Реакции: WMix

Beavis

Banned
В общем, мне, из сказанного ими, собственного опыта и приведенного тобой кода ясно видно, что исключения при обработке формы не годятся.
Я все страницы темы не читал, но, по-моему, даже из названия "Исключение" понятно, что они не годятся для валидации формы, т.к. некорректное введенное пользователем значение не является исключительной ситуацией для программы. Это вполне нормальная ожидаемая ситуация. И должна обрабатываться соотвественно.
А многие их просто используют вместо goto.
 

itprog

Cruftsman
Фанат
не понял вопроса. если речь про то, что отсутствует текст первичной ошибки т.е. error_get_last(), то это вопрос уже к следующей строке.
 

Фанат

oncle terrible
Команда форума
Фанат
не понял вопроса. если речь про то, что отсутствует текст первичной ошибки т.е. error_get_last(), то это вопрос уже к следующей строке.
Ну так я же не знаю, что написано в этой строчке. Но я знаю любовь говнопыхеров в собакам.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
некорректное введенное пользователем значение не является исключительной ситуацией для программы.
Недостаток данных, необходимых для принятия решения или выполнения действия, которые программа не может получить из другого источника или вычислить самостоятельно, является исключительной ситуацией. И не важно, пользовательский это ввод, или поиск на диске, или доступ к удаленному ресурсу. Какая разница?
а само название конструкции «try - catch» уже говорит, что это — ожидаемая исключительная ситуация. (которая может произойти, да, и мы предусматриваем действия на этот случай)
 

Фанат

oncle terrible
Команда форума
флоппик, ты сейчас такую ерунду написал, что даже объяснять лень
ожидаемая исключительная ситуация - оксюморон.
если следовать твоей логике, то цикл while($data=get_data()) должен кидать исключение, когда функция не вернёт данных.
 

Фанат

oncle terrible
Команда форума
когда мы ищем инфу на диске, есть два варианта.
1. эта инфа там должна быть всегда
2. она может быть, а может не быть
В первом случае, если её нету - это исключительная ситуация.
Во-втором - нормальная. Мы можем обработать его, как исключение. Но это будет то, о чем говорили фиксер и фишер - использование исключений не по назначению.
поскольку отсутствие файла во втором случае - это штатная ситуация, а не ислючительная, то и обрабатывать её более логично (на мой взгляд) штатными средствами - проверить файл, и если нету, то просто создать его.
 
Сверху