Зачем нужна @ в php

@

  • за

    Голосов: 6 19,4%
  • против

    Голосов: 25 80,6%

  • Всего проголосовало
    31

Absinthe

жожо
админ c перепою воткнул open_basedir
приложение перестало работать
твои действия?
В зависимости от фатальности случая либо забиваю(просто в лог), либо логирую и выкидываю эксепшн 500
 

fixxxer

К.О.
Партнер клуба
Фанат
Вурдалак

я про такой примерно try/catch

PHP:
try {
    $result = unlink($file);
} catch (PhpError_Warning_Exception $e) {
    if (!$e->hasSubstring('No such file')) {
        $Logger->logException($e);
        $result = false;
    } else {
        $result = true;
    }
}
UPD: edited
 

Фанат

oncle terrible
Команда форума
Вурдалак
Мне, по большому счету, никакой еррор хендлер не нужен. и переносить ничего никуда не надо.
Возникшая нештатная ситуация сама уйдет в лог, я её там прочту и настучу по голове админу.

ты путаешь штатную работу программы с ошибками.

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

if(exists()) - это то же самое, что if(isset($_GET['search'])). Это не "борьба с ошибками", а ветвление программы. Есть переменная - такой код выполняем, нету - другой.
здесь вообще не идет речь об ошибках.
это логика программы.
если у нас программа предусматривает состояния, когда переменная может быть, а может и не быть - надо проверять её существование.
то же самое и с твоим файлом кэша.

Мы до ошибки здесь даже не доходим.

У меня на работе был случай, аналогичный обсуждаемому - @mkdir()
каталог может существовать, в этом случае будет ошибка - мы её задавим.
ага. это всё работало ровно до тех пор, пока линукс где-то там выбрал какие-то свои лимиты и перестал создавать директории.
после того, как ошибка была, все-таки, найдена вслепую
я заменил код на if (!exists) mkdir()
теперь mkdir вызывается тольо тогда, когда она действительно нужна. это - ЛОГИКА ПРОГРАММЫ
а ошибка теперь вылезает, если программа не может создать папку. это - ОШИБКА.

как эти вещь можно между собой путать - я не понимаю.
возможно, я один тут такой дремучий, сидящий на поддержке в этих ошибках по уши, а остальные - лихие девелоперы, которым главное наваять и сдать заказчику, а дальше хоть трава не расти.
возможно, это только мне критично, чтобы программа в штатном режиме не генерила БЕССМЫСЛЕННЫХ ошибок,
НО
при возникновениии реальной ошибки - тут же меня информировала

но в этом случае поставьте себе еррор репортинг в ноль и вообще не запаривайтесь
 

Вурдалак

Продвинутый новичок
fixxxer, вот ещё один плюс exception'ам: ими можно различать ситуацию удаления файла с кешем, судьба которого никого не волнует, от ситуации с удалением какого-то файла, который должен быть к тому моменту живым.
 

Вурдалак

Продвинутый новичок
ты пойми, иф в данном случае - не часть обработчика ошибок а часть логики программы.
программы, которая не должна порождать ошибок при штатной работе.
И ты меня пойми: твой if(exists()) не проверяет файл на существование во момент вызова unlink.

Аналогично, твой if(!exists) mkdir не проверяет реально на существование директории. Посмотри на пример fixxxer'а: ты бы аналогично мог заменить это на try-catch, где в catch'е бы проверил ошибку: она связана с отсутствием директории или это linux с ума сошёл?
 

fixxxer

К.О.
Партнер клуба
возможно, я один тут такой дремучий, сидящий на поддержке в этих ошибках по уши, а остальные - лихие девелоперы, которым главное наваять и сдать заказчику, а дальше хоть трава не расти.
возможно, это только мне критично, чтобы программа в штатном режиме не генерила БЕССМЫСЛЕННЫХ ошибок,
НО
при возникновениии реальной ошибки - тут же меня информировала
Ну мне-то этого точно объяснять не надо. У меня всё (включая notice) завернуто в exception-ы, все необработанные/залогированные обработчиком исключения летят на почту и в джаббер :)
 

Фанат

oncle terrible
Команда форума
fixxxer
Я про такой же.
Если необходимость в нем действительно возникнет.
в чем я сильно сомневаюсь.

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

Вурдалак

Продвинутый новичок
мы точно реальный случай обсуждаем, а не воображаемый?
Безусловно, воображаемый. Но на таком абстрактном примере видна вся порочность твоего подхода. Подход с exception'ами фактически ничем не уступает твоему, зато имеет плюсы.
 

Фанат

oncle terrible
Команда форума
Вурдалак
ага, и $search=$_GET['search'] тоже в трай завернуть.
не вылезнло ошибки - ищем, вылезло - выводим форму.
твой if(!exists) mkdir не проверяет реально на существование директории.
не проверяет.
но ошибок с тех пор не выдавал.
начнет выдавать - я засуну в трай.

пока у меня в таком трае лежит только parse_url(), которой без этого просто не обойтись
 

fixxxer

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

Фанат

oncle terrible
Команда форума
Ладно, обсуждайте свои воображаемые ошибки без меня.
У меня реальных полно, которыми заниматься надо.
 

Фанат

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

fixxxer

К.О.
Партнер клуба
Согласен, осмысленная иерархия исключений была бы намного лучше. Вот только хрен ее сделаешь в PHP.
 

Вурдалак

Продвинутый новичок
Фанат, в идеальном мире, где программы пишут идеальные программисты и нет понятия QA, был бы просто свой exception типа MissingFileException. В других языках такое встретить можно, а PHP — это, к сожалению, плохой язык.
 

Фанат

oncle terrible
Команда форума
Я писал, что там. на первой странице ещё.
точно так же, как я писал на этой про isset. чтобы мне еще им здесь тыкали.
 

Фанат

oncle terrible
Команда форума
В общем, так.
С собакой, вроде, разобрались - никто её полезной не считает.

Теперь про исключения.
Чисто технически применять их вместо проверки состояния программы можно, но криво.
Я проиллюстрировал это доведением ситуации до абсурда, использовав исключение вместо isset()
Однако чисто технически это работает.

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

Мне такое поведение кажется мартышкиным трудом и использованием исключений не по назначению.
Если мне надо проверить файл на существование - я использую специальную, предназначенную для этого функцию, а не буду писать её аналог внутри исключения.
Единственный случай, где без этого изврата не обойтись - функция, которая порождает системную ошибку на пустом месте, например - parse_url() до версии 5.3.3
С помощью кастомного эррор хендлера мы делаем эту ошибку исключением, ловим его, и, поняв, что ошибка именно та, которую мы ждали - обрабатываем её:
- если урл должен быть валидным, то кидаем какое-нибудь исключение, 404 например.
- если урл может быть невалидным, то ничего не делаем. В этом последнем случае наше исключение действует как избирательная собака на один-единственный тип ошибки.
 

zerkms

TDD infected
Команда форума
вот это уже было бы исключительной ситуацией, хотя тут вероятность 0.000...
И какой же у этой исключительной ситуации будет обработчик (ну вот в вашем представлении)?

Это я намекаю на очередной антипаттерн "пустой обработчик исключения", который по факту ничем не лучше собаки

ps: топик не читай - сразу отвечай, вы всё уже обсудили и так это уже :))
 
Сверху