Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неявно передать __LINE__ в функцию 
:(
    Опции темы
Code Magister
Дата 21.12.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Magister of Code
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 9.7.2004
Где: Kiev

Репутация: нет
Всего: 1



Допустим у меня есть свой обработчик ошибок

Код

function error($error_code=0, $error_message='unknown', $file, $line)
{
    echo "Ошибка #$error_code: $error_message в $file:$line";
}


И если в каждом месте где возникает ошибка писать
Код

error(5, 'error', __FILE__, __LINE__);


То вот эти __FILE__ и __LINE__ ухудшают код, возможно ли как-то сделать чтобы они передавались сами?
А если нет, то как тогда это получается у стандартного класса Exception?
--------------------
PM MAIL WWW ICQ   Вверх
vasac
Дата 21.12.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: нет
Всего: 36



Используйте исключения, поставьте себе xdebug и не насилуйте себя и код подобными извращениями.
PM WWW   Вверх
Endeveit
Дата 22.12.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 2.6.2006

Репутация: 1
Всего: 7



PM WWW   Вверх
Code Magister
Дата 24.12.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Magister of Code
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 9.7.2004
Где: Kiev

Репутация: нет
Всего: 1



Не извращения, то что я написал это для примера, а эта штука мне реально нужна

а что debug_backtrace? Она же тоже покажет место, с которго была вызвана
--------------------
PM MAIL WWW ICQ   Вверх
vasac
Дата 24.12.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: нет
Всего: 36



Code Magister, расскажите зачем.
PM WWW   Вверх
Code Magister
Дата 24.12.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Magister of Code
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 9.7.2004
Где: Kiev

Репутация: нет
Всего: 1



Ну я хочу сделать свой Exception а не юзать стандартный, только не спрашивайте зачем, и вообще я спрашивал как конкретно это можно сделать, а не как сделать чтобы было что-то похожее, и как этого НЕ делать тоже не спрашивал. 
Например в Си можно было бы сделать макрос который бы сам подставлял __LINE__ (не самое красивое решение) или возможно использовать inline-функции чтобы __LINE__ принимало значение именно той строки на которой произошел вызов функции(не уверен, не проверял). Интересует есть ли способы в PHP

Это сообщение отредактировал(а) Code Magister - 24.12.2007, 16:05
--------------------
PM MAIL WWW ICQ   Вверх
Glip
Дата 24.12.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: нет
Всего: 18



что-то не понял я ответили на ваш вопрос или нет.

ну вот например конструктор Exception из SPL
Код

    function __construct($message = NULL, $code = 0) {
        if (func_num_args()) {
            $this->message = $message;
        }
        $this->code = $code;
        $this->file = __FILE__; // of throw clause
        $this->line = __LINE__; // of throw clause
        $this->trace = debug_backtrace();
        $this->string = StringFormat($this);
    } 

то есть вместо error(5, 'error', __FILE__, __LINE__); - throw new Exception($message, $code)

можно еще добавить 

Код

    function error2Exception($code, $string, $file, $line, $context)
    {
        throw new Exception($string, $code);
    }

    set_error_handler('error2Exception', E_ALL | E_STRICT);


на мой взгляд получается удобно.



--------------------
user posted image
PM MAIL   Вверх
sTa1kEr
Дата 11.1.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Code Magister
1. Свой обработчик ошибок можно зарегистрировать через set_error_handler(). Тогда через параметр $errline будет передаваться нужная строка.
2. Как уже было сказано, использовать debug_backtrace()
Код

$stack = debug_backtrace();
echo $stack[1]["line"]; // Тут и будет ваша строка.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0683 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.