[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выйти из цепочки методов через исключение
Страницы: 1, 2, 3
vasa_c
Я даю ответ - задача некорректна, без всякой грамматики.
Нет никакой "цепочки методов класса".
Есть стек вызовов. Бросаем исключение - ловим его выше по стеку, там где надо. Или не ловим.

А если Б не сам бросает исключение, а вызывает метод другого класса, который бросает?

_____________
Блог ГО | Таблица символов Юникода | Графомания
inpost
vasa_c
Стек вызовов, ок.
Метод x4 кидает исключение, ловим его в x3, теперь x3 кидает исключение для x2, x2 кидает исключение для x1, x1 принимает исключение - выходит из подпрограммы. Мне кажется данный способ избыточным.

Единственное, что приходит на ум, это использовать try-catch в самом верхнем родителе, тогда исключения на любом уровне будут выбрасывать в метод x1.

Получается делать так:
$_GET['a'] = 1;
class myClass {
public function x1() {
try {
$this->x2();
echo 'Финал';
} ...
}
public function x2() {
$this->x3();
}
public function x3() {
if(isset($_GET['a'])) {
throw new Exception('ups');
}
$this->x4();
}
public function x4() {
echo 'Всё ок!';
}
}

$x = new myClass();
$x->x1();
// а тут следующий код

По крайней мере такой способ позволяет выйти из любой цепочки (стека). Сейчас меня такое проектирование больше всего устраивает. Именно try-catch в родителе прописывать.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
linker
Вот херня же... Не надо никаких вызвал-поймал-вызвал-поймал. Достаточно дин раз вызвал и один раз поймал, как я отписал ранее. Настоятельно прошу перечитать мануал.

_____________
Gear Framework
Gear Framework на Github
vasa_c
inpost, слушай линкера


_____________
Блог ГО | Таблица символов Юникода | Графомания
killer8080
Цитата (inpost @ 9.03.2014 - 17:13)
Уточню, что в catch будет пусто в большинстве своём, так как класс ошибки будет генерировать иным путём за исключением случая.
тогда вообще не понятно зачем нужен эксепшин
$_GET['a'] = 1;
class myClass {
public function x1() {
if($this->x2())
echo 'Финал';
}
public function x2() {
return $this->x3();
}
public function x3() {
if(isset($_GET['a'])) {
return false;
}
return $this->x4();
}
public function x4() {
echo 'Всё ок!';
return true;
}
}

$x = new myClass();
$x->x1();
inpost
killer8080
Методы не на столько короткие. Они могут иметь и код дальше:
public function x2() {
$this->x3();
другой код.
третий код.
финал.
}


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
vasa_c
Мне кажется ты ещё не разобрался в исключениях.
Ну выкинул x3() исключение. Что дальше должно произойти?

_____________
Блог ГО | Таблица символов Юникода | Графомания
inpost
vasa_c
echo 'пустой код до работы класса';
$x = new MyClass();
$x->x1();

echo 'Простой код, который идёт после выполнения работы класса';
if($x->error === true) {
echo 'Специальный блок с ошибками: класс неверно отработал';
}
echo 'Обычный код, который идёт после класса и ему без разницы, что было с классом';

$x3 выкинул исключение, работа стека завершена ошибкой, мы выходим из цепочки (из стека) и всё, продолжаем работать со страницей дальше игнорируя существования ошибки.

Я просто не понимаю, что вы мне кидаете мануал на работу исключений? Я специально ещё раз всё прочитал и не увидел для себя нечто нового, то есть всё, что там написано - я знаю.

_______________
Пока я остановился на структуре, которую выше написал, создавать try-catch именно в главном родителе, то есть в $x1, именно в том месте, откуда начинается цепочка вложенностей.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
linker
Это зависит от того, кому важнее перехватить исключение. Если класс A использует класс B, то наверное логичнее ловить исключения в A. Но если важно отследить работу класса A, то ловить исключения надо выше по стэку. А твой вариант получается таким говнокодом
$x->x1();
if ($x->error) {}
$x->y1();
if ($x->error) {}
$x->z1();
if ($x->error) {}

вместо нормального
try
{
$x->x1();
$x->y1();
$x->z1();
}
catch(Exception $e)
{
}


_____________
Gear Framework
Gear Framework на Github
inpost
linker
ты фальсифицируешь в данном примере.
Вариант первый:
$x->x1();
if ($x->error) {}
$x->y1();
if ($x->error) {}
$x->z1();
if ($x->error) {}

И второй (который ты показал):
try {
$x->x1();
} catch(Exception $e){}
try {
$x->x2();
} catch(Exception $e){}
try {
$x->x3();
} catch(Exception $e){}


А вся причина в том, что между ними может быть код определённый, а то и целая страница кода.

Но я твою мысль понял, я хочу узнать ещё от других людей. Возможно они увидят картину с другой стороны.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
vasa_c
не должно быть такого понятия "выполнение работы класса".

Есть класс A, есть B:

у нас вызовы:
A::one()
A::two()
B::three()
B::four()

Вызовы никак не должны группироваться по классам.

B::four() пиз..улся. A::two() поймал если ему надо.

_____________
Блог ГО | Таблица символов Юникода | Графомания
inpost
vasa_c
Да это я понимаю, не так выражаюсь, я же выше говорил. Я имел ввиду не класс, а лишь 1 метод, которой порождает цепочку (стек) вызовов других методов.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
glock18
Вообще говоря, все правильно сказано о том, что архитектура просто неправильная. Вообще такой код некорректен в принципе, и разумен только в форме, предложенной киллером (без исключений).

Если же нужны исключения, то, где их обрабатывать, зависит в первую очередь от того, внутренние (private) это или же общие (public) исключения. В частности, если паблик, то ловить его внутри класса не надо, и try/catch должен при необходимости оборачивать сам первичный вызов.

Если же это внутреннее исключение, то такая цепочка вызовов совершенно неудобна, и самый простой и естественный вариант был бы:

public function x()
{
try
{
$this->x1();
$this->x2();
$this->x3();
$this->x4();
}
catch (Exception $e)
{
// handle exception
}
}


Если же среди всего, что вообще есть в исключениях, смущает только лишь то, что возвращает сервер в случае, если оно не поймано, то установи свой хендлер и возвращай что угодно.
inpost
Я не могу понять. Архитектуру, которую вы видели:
Есть метод А и метод Б, При вызове метода А, внутри него идёт вызов метода Б. Всё.
Чем неправильно вызывать метод Б внутри метода А? Если один метод вызывает другой метод - уже ошибка? Ничего не могу понять.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
glock18
inpost
Ты, кажется, с вопросом пришел. Тебе уже несколько вариантов предложили еще на первой странице, по-моему. Уже объяснили даже, в чем проблема. А реакция примерно означает "да все ок у меня, докажи что это не так".
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.