Исключения или trigger_error?

Духовность™

Продвинутый новичок
Исключения подразумевают код, который их будет отлавливать. trigger_error просто выводит ни на что не влияющий warning. Использовать ли в ОО системах trigger_error? Или работать исключительно с исключениями?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
как раз таки trigger_error выводит не варнинг а то, что тебе надо выести, плюс оно ловится назначением set_error_handler()
 

Духовность™

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

у меня есть метод такого плана:

PHP:
    public function getMethodNameByKeyWithPrefix($property_name, $action = 'set')
    {
        $key = preg_replace('~^' . static::$db_field_prefix . '_([a-z0-9_]+)$~', '$1', $property_name);

        if (isset(static::$model_attributes[$key]))
        {
	        $args = explode('_', $key);

	        $count = count($args);

	        for ($i = 0; $i < $count; $i++)
	        {
	            $args[$i][0] = strtoupper($args[$i][0]);
	        }

	        $key = implode('', $args);

	        if (!in_array($action, array('set', 'get')))
	        {
	            trigger_error('Указан некорректный action <b>' .
	                          $action .
	                          '</b> в контексте вызова метода <b>' .
	                          __METHOD__ . '</b>', E_USER_WARNING);

	            return null;
            }

	        return $action . $key;
        }

        return null;
    }
я тут юзаю trigger_error. Почему? Потому, что вызов метода с плохим параметром, отличным от строк set или get не приведет к какой-то фатальной операции и прерывать работу программы исключением смысла нет.

Но с другой - прав ли я?
 

AmdY

Пью пиво
Команда форума
исключение нужно для того, чтобы его обрабатывать. если ты его не кэтчишь, то лучше triger_error. а лучше просто писать в лог.
 

Ярослав

Новичок
Может тут стоит использовать InvalidArgumentException или UnexpectedValueException?

Единственное где я использую trigger_error это когда нужно указать deprecated методы (E_USER_DEPRECATED)
 

Духовность™

Продвинутый новичок
Может тут стоит использовать InvalidArgumentException или UnexpectedValueException?
так вопрос в том, а надо ли клиентскому коду ловить эти исключения или достаточно warning-a, который запишется в лог и его посмотрит разработчик..
 

Вурдалак

Продвинутый новичок
Всё очень просто. Если тебе доставляет удовольствие везде ставить условия, проверяя результат каждой предыдущей операции, то не используй исключения.

Покажи ради интереса место вызова метода getMethodNameByKeyWithPrefix().
 

Adelf

Administrator
Команда форума
Покажи ради интереса место вызова метода getMethodNameByKeyWithPrefix().
У него вместо исключения возврат null. Тоже в общем нормально. Но когда тебе нужно в пользовательском коде более подробно знать почему вернулся null(файла нужного не было или база не подключилась) - тогда исключения удобны.
Но самое большое удобство их проявляется при большой вложенности. Допустим вызывают один метод. Этот метод вызывает наш метод. Наш метод кидает исключения. Срединный - ловит какие ему интересны и какие он может обработать, остальные пропускает(ибо не знает что с ними делать). А верхний ловит свои. Както так.
 

tz-lom

Продвинутый новичок
в принципе т.к. warning не останавливает выполнение (и можно сделать что то типа 'Awating integer,string given, casted successfull') trigger_error можно пользоваться
с другой стороны лично я код с warning не считаю правильным , и предпочитаю выбрасывать ошибку чтобы неправильный код нельзя было использовать ни при каких обстоятельствах
 

AmdY

Пью пиво
Команда форума
Духовность™
сделай просто переключалку режима, проблема отпадёт и будут оба варианта возможны.
$obj->setErrorMode(EXCEPTION_ON_ERROR);
 

atv

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

weregod

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

HEm

Сетевой бобер
это если "условия, приводящие к возникновению нефатальной ошибки", будут воспроизводиться постоянно.
А если вы не будете писать их в лог, вы не узнаете, постоянно это случается или раз в пятилетку.
 

NeD

Новичок
если ошибка не критична, то лучше trigger_error ИМХО
Исключения нужно уметь обрабатывать, а это не все умеют делать правильно.
На bestpersons.ru бывает вот такое вываливается на главной странице:) я считаю, что пользователь это видеть не должен:)
Код:
java.sql.SQLException: The table 'userblocks' is full
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2409)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at ru.bestpersons.structs.BPPreparedStatement.executeUpdate(BPPreparedStatement.java:51)
    at ru.bestpersons.storages.BlocksStorage.getUserBlocks(BlocksStorage.java:188)
    at _jsp._index__jsp._jspService(index.jsp:413)
    at com.caucho.jsp.JavaPage.service(JavaPage.java:61)
    at com.caucho.jsp.Page.pageservice(Page.java:587)
    at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:192)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:76)
    at ru.bestpersons.web.LangFilter.doFilter(LangFilter.java:240)
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:76)
    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:178)
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:241)
    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:268)
    at com.caucho.server.port.TcpConnection.run(TcpConnection.java:586)
    at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:690)
    at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:612)
    at java.lang.Thread.run(Thread.java:619)
 

atv

Новичок
А если вы не будете писать их в лог, вы не узнаете, постоянно это случается или раз в пятилетку.
А разве речь шла о том чтобы не писать в лог? ТС спрашивает что использовать, триггер или исключения. А писать логи при использовании исключений религия не позволяет? И что сложного в обработке исключения? Если по логике приложения исключение невозможно обработать исключение незаметно для пользователя, то показываем пользователю страничку с извинениями, при этом записав в лог и отправив сообщения админам, разработчикам и т.д.

Триггер, это прошлый век, наследие доООП эпохи, остался только для обратной совместимости. Исключения полностью заменяют его, добавляя при этом новые возможности.
 

fixxxer

К.О.
Партнер клуба
Если ты не пишешь, как чудак на букву "м", то любой notice свидетельствует о серьезной ошибке в логике (опечатка в имени переменной и т.п.). Очевидно, такое надо писать в лог и вываливать internal error.
 

Духовность™

Продвинутый новичок
по моему грамотное описание http://habrahabr.ru/blogs/php/130597/

ошибки и исключения — это совершенно разные инструменты для решения совершенно разных задач:
ошибка — не поправимая ситуация;
исключение – позволяет прервать выполнение каскада функций и пробросить некоторую информацию. Что-то вроде глобального оператора return. Если у Вас нет каскада, то вам достаточно использовать if или return.
 
Сверху