Проблема с Exeptions

Fray

Новичок
Проблема с Exeptions

Привет, недавно начал изучать ООП, проблема с понимание механизма исключений :(

Из книжки Thinking in Java я вынес следующее:

PHP:
 public function connect ($host, $login, $pass)
{	
	try {
		if (!mysql_connect($host, $login, $pass)) 
			throw new Exception("Could not connect to database");
	} catch (Exception $e) {
		Debug::printException($e);
	}
}
Проверил, работает, но есть несколько вопросов:
1) Разве правильно бросать исключение в блоке проверки, или этот блок должен повторно проверять наличие ошибки?
2) Как повторно использовать эту ловушку внутри метода?
3) Что если между двумя проверками есть дополнительный код, правильно ли будет писать
PHP:
try {} catch {} 
/* some code */ 
try {} catch {}
4) Как правильнее организовать работу с исключениями в PHP?

Буду благодарен если вы ответите на мои вопросы или укажете на толкое чтиво для чайников.
 

Fray

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

Кром

Новичок
Я не использую. Не вижу нужды. Но это только мое мнение.
 

[sid]

Новичок
Я считаю исключения крайне полезным механизмом. Моя framework система перехватывает ошибки PHP и транслирует их в опредленные исключения. Этот метод мне нравится тем, что можно создать дерево исключений (наследуясь от Exception), которое будет представлять собой ошибки вашей информационной системы и обработка ошибок сосредоточена в одном месте. Такой механизм позволят сделать более сложной трассировку ошибок, так как трассировщик получает в свое распоряжение море детальной информации об ошибке (которую конечно же предоставляете вы). Но с другой стороны в таком случае программировать обработку ошибок сложнее (хотя лично для меня это не проблема). Опять таки это IMHO.
 

demongloom

Новичок
Исключение это некий аналог goto которого очень не хватает если использовать всякие trigger_error, приходилось извращаться с различными ifами.

В целом достаточно использовать
function aaa() {
try {
// code
} catch (exception $e) {
trigger_error("Exception:\n" . $e->getMessage . "\nStack Trace:\n" . $e->getTraceAsString(), $e->getCode);
}
}

Хотя особые параноики как я, могут использовать следущее:
1. особую функцию которая генерит exceptions, автоматически их сбрасывает.
2. особые классы которые потомки exception, которые при создании сами себя сбрасывают.

-~{}~ 09.07.05 22:36:

Особенность исключений над обычными ошибками:
1. Доп. информация.
Они уже содержат в себе более детальную информацию. К примеру трэйс. Очень удобно, т.к. можно не переписывать error_handler.

2. Они могут быть стандартизированы.
Нет нужды одинаковые ошибки описывать в файле/ах по нескольку раз. Достаточно некого общего exception который подходит под ситуацию. Так же в этот exception можно встроить функцию форматирования ошибки, тогда будет достаточно лишь передать некие основные параметры ошибки, а текст и оформление с обработкой будут заложены в самом exception. Для примера можно прикрутить локализацию ошибки под выбранный язык. Работа с локализацией засунута в exception и нет нужды менять ничего в коде который этот exception вызывает.

3. Намного удобней перехватывать.
Обычно ошибки в функциях возвращаются так:
function err() {
if(...blablabla...) {
return trigger_error("bla bla bla error",E_USER_WARNING); }
}
Результат будет null.
Можно для более удобного определения что произошла ошибка
возвращать некую константу типа __ERR.
А можно возвращать exception. Тогда в зависимости от ситуации можно либо выводить его (вывод ошибки), либо производить некие действия без вывода ошибок.

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

В принципе exception позволяет делать экстренный выход из циклов/конструкций, в то время как с trigger_error это сделать намного тяжелей.

для примера:
PHP:
function exception_break() {
try {
	if(....) {
		for(....) {
			foreach(....) {
				if(....) {
					throw new exception("...."); }
			}	# foreach
		}	# for

	} elseif(....) {
		throw new exception("...."); 
	}	# if

} catch (exception $e) {
	trigger_error($e);
}	# try

	for(....) {
		....
	}	# for

	return ....;
}
PHP:
function trigger_break() {
	if(....) {
		for(....) {
			foreach(....) {
				if(....) {
					$err = true;
					trigger_error("...."); 
					break;
				}
			}	# foreach
		if($err) {
			break; }
		}	# for

	} elseif(....) {
		trigger_error("...")
	}	# if


	for(....) {
		....
	}	# for

	return ....;
}
 

Кром

Новичок
>Исключение это некий аналог goto которого очень не хватает если использовать всякие trigger_error, приходилось извращаться с различными ifами.

Такое сравнение не выдерживает никакой критики. :)

Особенность исключений над обычными ошибками:
1. Доп. информация.
Они уже содержат в себе более детальную информацию. К примеру трэйс. Очень удобно, т.к. можно не переписывать error_handler.
А чем не устраивает debug_backtrace?

2. Они могут быть стандартизированы.
Нет нужды одинаковые ошибки описывать в файле/ах по нескольку раз. Достаточно некого общего exception который подходит под ситуацию. Так же в этот exception можно встроить функцию форматирования ошибки, тогда будет достаточно лишь передать некие основные параметры ошибки, а текст и оформление с обработкой будут заложены в самом exception. Для примера можно прикрутить локализацию ошибки под выбранный язык. Работа с локализацией засунута в exception и нет нужды менять ничего в коде который этот exception вызывает.
Все это можно сделать с помощью собственной функции error('error msg','another params')

3. Намного удобней перехватывать.
Обычно ошибки в функциях возвращаются так:
function err() {
if(...blablabla...) {
return trigger_error("bla bla bla error",E_USER_WARNING); }
}
Результат будет null.
Не показательный пример. Что там такого неудобного я так и не понял.
И совершенно необязательно возвращать trigger_error.
 
Сверху