негодования пост

Статус
В этой теме нельзя размещать новые ответы.

zerkms

TDD infected
Команда форума
негодования пост

аргх, оказывается в нашем любимом ЯП из __toString() нельзя прокинуть эксепшн выше по стеку.
потратил на отладку вечер.
зол.
 

zerkms

TDD infected
Команда форума
Fortop
эксепшн вполне может кинуться внутри метода, который вызывается в __toString(), к тому же trigger_error() не несёт почти никакой полезной информации.
 

Fortop

Новичок
ксепшн вполне может кинуться внутри метода, который вызывается в __toString(),
И? В чем вопрос?

к тому же trigger_error() не несёт почти никакой полезной информации.
А это зависит от того то мы ему передадим.

Костыль конечно, но можно так
PHP:
<?php
function errh($errno, $errstr, $errfile, $errline ) {
    if ($errno == E_USER_DEPRECATED) {
        var_dump(unserialize(stripslashes($errstr)));
        return true;
    } else {
        return false;
    }
}
set_error_handler("errh");

class C {


    public function render()
    {
        return 'meet';
    }

    public function __toString()
    {
        try {
            return $this->render();
        } catch (Exception $e) {
            $t = addslashes(serialize($e));
            trigger_error($t,E_USER_DEPRECATED);
            return '';
        }
    }
}

class D extends C {
    public function render()
    {
        throw new Exception('Ooops');
    }
}

$d = new D;
echo $d;
 

dimagolov

Новичок
Fortop, смысл Exception не в том, что его можно кинуть, а в том, что его можно в строго определенном месте словить.
 

Fortop

Новичок
Fortop, смысл Exception не в том, что его можно кинуть, а в том, что его можно в строго определенном месте словить.
Не надо мне этого рассказывать. Лучше подумать о том, какой смысл ловить/бросать исключение при выводе или приведении объекта к строке?

Говно какое. bugs.php.net ?
Это уже там было.
Ответ разработчиков - читайте внимательно документацию.
 

Adelf

Administrator
Команда форума
Лучше подумать о том, какой смысл ловить/бросать исключение при выводе или приведении объекта к строке?
Чем данные ситуации отличаются от других? Что в них такого особенного, что нельзя эксепшен кидать?
 

fixxxer

К.О.
Партнер клуба
Ага, как всегда, задокументированная бага становится фичей. :)

Но с __call тогда продавили помнится, хотя и заняло 5 лет. Надо пинать все равно.
 

dimagolov

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

тут спорно 2 вопроса.
1. почему не работают исключения в __toString, какие архитектурные причины такого поведения
2. полезна ли в принципе возможность исключений в __toString
 

Fortop

Новичок
Adelf
Чем данные ситуации отличаются от других? Что в них такого особенного, что нельзя эксепшен кидать?
А подумать? Это право же несложно.
А если еще и мануал почитать.
It is worth noting that before PHP 5.2.0 the __toString method was only called when it was directly combined with echo() or print().
То вообще все станет на свои места.

Ага, как всегда, задокументированная бага становится фичей.
Судя по всему это не бага, это legacy код.

-~{}~ 11.03.10 19:30:

Fortop, то есть ты утверждаешь,
Я ничего не утверждаю.
Я предлагаю не жить вашими иллюзиями. И пользоваться мануалами.

Вот это
Надо пинать все равно
правильный вывод.
А надувание щек и рассуждение о том какой язык г-но и как это нелогично... ну можно и так. Но это детский сад.

-~{}~ 11.03.10 19:33:

2. полезна ли в принципе возможность исключений в __toString
Возможно и полезна. Но ее пока нет.

-~{}~ 11.03.10 19:36:

Да, маленькое уточнение. Исключения сейчас возможны. Но они должны быть обработаны внутри этого метода. Т.е.
из __toString() нельзя прокинуть эксепшн выше по стеку.
 

fixxxer

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

Но как показывает практика, если долго пинать, то могут и сделать. ;) А еще лучше написать и прислать патч )
 

Fortop

Новичок
http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring

сразу под примером. Я это уже цитировал.
It is worth noting that before PHP 5.2.0 the __toString method was only called when it was directly combined with echo() or print().
Судя по этому, типичный legacy код.

Более того, могу еще пример дать
PHP:
trigger_error('sample ' . chr(0) . ' sample');
 

Духовность™

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

А надувание щек и рассуждение о том какой язык г-но и как это нелогично... ну можно и так. Но это детский сад.
Fortop опять умничает...
 

nerezus

Вселенский отказник
> Ответ разработчиков - читайте внимательно документацию.
Там какой-то чудень однажды сказал, что падение интерпретатора в сегфол - не баг, а фича. Теперь не удивлюсь уже ни чему.
 

zerkms

TDD infected
Команда форума
Fortop
То вообще все станет на свои места.
вообще-то на свои места оно не встало. что следует из того, что до 5.2 он использовался только совместо с echo и print?

а ты расскажи, зачем тебе исключения понадобились для ту-стринг?
ну конкретно ситуация такая: в шаблоне (класс View, который, собственно, тустрингается) у меня юзается объект user. user - получает данные из БД + facebook. из обоих сорсов - лениво. если очешь захотеть - можно получить ситуацию, когда получение данных из facebook вывалится с эксепшном (ожидаемым эксепшном). по этому событию на самой вершине стека у меня есть try / catch который обрабатывает ошибки коммуникации с facebook'ом.
из-за озвученной баго-фичи пришлось этот функционал продублировать (см. скопипастить) ещё и во View.

А это зависит от того то мы ему передадим.

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

Я предлагаю не жить вашими иллюзиями. И пользоваться мануалами.
в мануале явно этого не описано. свои эротические фантазии по этому поводу и самозаключениями можешь поделиться с комитетом спортлото.

Судя по всему это не бага, это legacy код.
"судя по всему" или точно? сударь, вы уж определитесь, или это бага, или это не бага (в таком случае дружно просим ссылку на ЯВНОЕ УКАЗАНИЕ, что из __toString() нельзя выкинуть эксепшн)
 

dr-sm

Новичок
туСтринг говорите

PHP:
var Qq = function() {
	
	return {
		toString : function() {
			throw "Om Namah Shivaya";
			return "OMG";
		}
	}
};

try {
	// WTF?
	alert(new Qq());
	//alert("WTF: " + new Qq());
} catch(e) {
	alert(e);
}
trust no one :D

-~{}~ 12.03.10 01:21:

имплисит конвершонс зло!!!111
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху