|
|
|
| Почему кэтч не ловит у меня исключение?
<?php
class MyException extends Exception { }
class Test {
public function testing($x) {
try {
echo 1/$x;
} catch (MyException $e) {
echo $e->getMessage('Деление на ноль.');
}
}
}
$foo = new Test;
$foo->testing(0);
?>
|
| |
|
|
|
|
|
|
|
для: super-php
(06.04.2013 в 19:48)
| | Потому что его надо для начала выбросить
<? throw new Exception ();
|
Код у вас совсем странный) | |
|
|
|
|
|
|
|
для: MHz
(06.04.2013 в 20:10)
| | для лоя чего тогда слово catch?ведь в его блоке оно бросается | |
|
|
|
|
|
|
|
для: super-php
(06.04.2013 в 20:32)
| | вообще по-хорошему нужно юзать set_exception_handler и забыть что такое try/catch | |
|
|
|
|
|
|
|
для: psychomc
(06.04.2013 в 21:13)
| | И как тогда их обрабатывать? Все исключения в одном блоке? | |
|
|
|
|
|
|
|
для: MHz
(06.04.2013 в 21:31)
| | для начала открыть мануал | |
|
|
|
|
|
|
|
для: psychomc
(06.04.2013 в 21:38)
| | мануал по чему? по исключениям? все равно же бе try catch не обойтись | |
|
|
|
|
|
|
|
для: MHz
(06.04.2013 в 22:03)
| |
<?php
function exception_handler($exception) {
echo "Неперехватываемое исключение: <br /> " , $exception->getMessage();
}
set_exception_handler('exception_handler');
throw new Exception('Неперехватываемое исключение<br />');
echo "Не выполнено<br />";
?>
|
Вот замена блока вы говорили, глянул в мануле, чем он дает препочтнение, от обычного использование исключений? | |
|
|
|
|
|
|
|
для: super-php
(06.04.2013 в 22:30)
| | а что, вы предпочитаете усеять весь свой код конструкциями try/catch?
p.s по поводу первого поста. вы немного не понимаете суть ошибок и суть исключений. вторая функция, которая вам нужна - set_error_handler | |
|
|
|
|
|
|
|
для: MHz
(06.04.2013 в 22:03)
| | и почему же? | |
|
|
|
|
|
|
|
для: psychomc
(06.04.2013 в 23:02)
| | Ну а как тогда использовать свои классы исключений? или даже стандартные исключения.
тогда ведь весь смысл исключений теряется. | |
|
|
|
|
|
|
|
для: MHz
(06.04.2013 в 23:22)
| | абсолютно так же. наследуете от встроенного класса exception и используете. ничто вам не мешает внутри вашего обработчика проверить например с помощью instanceof тип сгенерированного исключения и обработать так как нужно. эта логика будет сосредоточена внутри одного обработчика, а не разбросана по всей системе. и никаких try/catch
не понимаю какой смысл для вас потерялся
<?php
class my_exception extends exception {}
function my_exception_handler(exception $exception) {
echo get_class($exception);
echo $exception->getMessage();
}
set_exception_handler('my_exception_handler');
throw new my_exception('test');
?>
|
| |
|
|
|
|
|
|
|
для: psychomc
(06.04.2013 в 23:47)
| | Да каких размеров получиться этот один обработчик, чтобы обрабатывать в нем хотя бы стандартные исключения? Как например пробросить исключение, при этом не зная куда, потому что реализовать это в единственном обработчике невозможно. В общем я даже представить не могу как обрабатывать все в одном обработчике) Абсолютно теряется вся гибкость. | |
|
|
|
|
|
|
|
для: MHz
(07.04.2013 в 02:11)
| | интересно всё-таки какая гибкость теряется, если исключения одного типа как правило всегда обрабатываются одинаково. в конце концов, какой код для вас лучше?
1)
<?php
class my_exception1 extends exception {}
class my_exception2 extends exception {}
class my_exception_handler
{
public static function handle(exception $exception) {
if ($exception instanceof my_exception1) {
echo "Exception type my_exception1: " . $exception->getMessage();
// здесь делаем еще много всего
// что относится к обработке
// my_exception1
} elseif ($exception instanceof my_exception2) {
echo "Exception type my_exception2: " . $exception->getMessage();
// здесь делаем еще много всего
// что относится к обработке
// my_exception2
}
}
}
set_exception_handler(array("my_exception_handler", "handle"));
class test1
{
public function __construct() {
throw new my_exception1("test1 exception");
}
}
class test2
{
public function __construct() {
throw new my_exception2("test2 exception");
}
}
new test1;
?>
|
2)
<?php
class my_exception1 extends exception {}
class my_exception2 extends exception {}
class test1
{
public function __construct() {
try {
throw new my_exception1("test1 exception");
} catch (my_exception1 $exception) {
echo "Exception type my_exception1: " . $exception->getMessage();
// здесь делаем еще много всего
// что относится к обработке
// my_exception1
} catch (my_exception2 $exception) {
echo "Exception type my_exception2: " . $exception->getMessage();
// здесь делаем еще много всего
// что относится к обработке
// my_exception2
}
}
}
class test2
{
public function __construct() {
try {
throw new my_exception2("test2 exception");
} catch (my_exception1 $exception) {
echo "Exception type my_exception1: " . $exception->getMessage();
// здесь делаем еще много всего
// что относится к обработке
// my_exception1
} catch (my_exception2 $exception) {
echo "Exception type my_exception2: " . $exception->getMessage();
// здесь делаем еще много всего
// что относится к обработке
// my_exception2
}
}
}
new test1;
?>
|
а если классов будет хотя бы штук 20? к слову, гибкости обычно добиваются в классе наследнике от exception, а не в обработчике исключения | |
|
|
|
|
|
|
|
для: psychomc
(07.04.2013 в 10:55)
| | В первом случае у вас в момент когда вы поймали исключение, уже нет доступа к классу который его выбросил.
Зачем добиваться гибкости в самом классе наследнике исключения, этот класс не знает ситуации когда возникло исключение и доступа у него к классу который выбросил это исключение тоже нет. | |
|
|
|
|
|
|
|
для: MHz
(07.04.2013 в 12:33)
| | вообще-то есть. в Exception есть встроенный метод getTrace
*конкретно к объекту нет, да и не нужно. но если уж вдруг понадобится, ничто не мешает дочерние классы написать таким образом, чтобы они принимали объект и при выбросе исключения скармливать им $this. хотел бы я посмотреть на ситуацию, когда после выброса исключения нужно еще что-то делать в контексте класса, который его выбросил | |
|
|
|
|
|
|
|
для: psychomc
(07.04.2013 в 12:38)
| | Как это не нужно, а если мне например нужно в случае выброса исключения отменить sql-транзакцию?
Передавать $this, это вы предлагаете описывать в нем каждый мой класс, который он должен уметь обрабатывать? | |
|
|
|
|
|
|
|
для: MHz
(07.04.2013 в 12:49)
| |
<?php
// пример
class test1
{
public function __construct() {
// ......
if (!file_exists($path)) {
// а вот тут можно отменить транзакцию
// и сделать всё что угодно ДО выброса исключения
// .....
throw new my_exception1("File " . $path ." is not exists");
}
}
}
|
не? | |
|
|
|
|
|
|
|
для: psychomc
(07.04.2013 в 12:53)
| | И это мне нужно будет везде прописывать вот такие конструкции, а не обрабатывать их как вы сами сказали одинаково для каждого типа исключения?
Да и зачем здесь мне исключение? Чтобы вывести file not exists? проще тогда выбрасывать стандартное exception и не париться. | |
|
|
|
|
|
|
|
для: MHz
(07.04.2013 в 13:15)
| | если что, это всего лишь был пример, который показывает, что там где вы выбрасываете исключение, ничто не мешает манипулировать объектом. главное это делать до выброса. | |
|
|
|
|
|
|
|
для: psychomc
(07.04.2013 в 12:53)
| | В общем сомнительное это преимущество все в один обработчик посылать) | |
|
|
|
|
|
|
|
для: MHz
(07.04.2013 в 13:16)
| | это не аргумент. приведите пример, когда удобнее использовать try/catch | |
|
|
|
|
|
|
|
для: psychomc
(07.04.2013 в 13:32)
| | Всегда, когда обработка исключения не ограничивается выводом сообщения об ошибке и логировании. | |
|
|
|
|
|
|
|
для: MHz
(07.04.2013 в 19:02)
| | так может все-таки подкрепите свои слова примером? | |
|
|
|