Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Исключения
 
 автор: super-php   (06.04.2013 в 19:48)   письмо автору
 
 

Почему кэтч не ловит у меня исключение?


<?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);

?>

  Ответить  
 
 автор: MHz   (06.04.2013 в 20:10)   письмо автору
 
   для: super-php   (06.04.2013 в 19:48)
 

Потому что его надо для начала выбросить
<? throw new Exception ();

Код у вас совсем странный)

  Ответить  
 
 автор: super-php   (06.04.2013 в 20:32)   письмо автору
 
   для: MHz   (06.04.2013 в 20:10)
 

для лоя чего тогда слово catch?ведь в его блоке оно бросается

  Ответить  
 
 автор: psychomc   (06.04.2013 в 21:13)   письмо автору
 
   для: super-php   (06.04.2013 в 20:32)
 

вообще по-хорошему нужно юзать set_exception_handler и забыть что такое try/catch

  Ответить  
 
 автор: MHz   (06.04.2013 в 21:31)   письмо автору
 
   для: psychomc   (06.04.2013 в 21:13)
 

И как тогда их обрабатывать? Все исключения в одном блоке?

  Ответить  
 
 автор: psychomc   (06.04.2013 в 21:38)   письмо автору
 
   для: MHz   (06.04.2013 в 21:31)
 

для начала открыть мануал

  Ответить  
 
 автор: MHz   (06.04.2013 в 22:03)   письмо автору
 
   для: psychomc   (06.04.2013 в 21:38)
 

мануал по чему? по исключениям? все равно же бе try catch не обойтись

  Ответить  
 
 автор: super-php   (06.04.2013 в 22:30)   письмо автору
 
   для: 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 />";

?>


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

  Ответить  
 
 автор: psychomc   (06.04.2013 в 23:02)   письмо автору
 
   для: super-php   (06.04.2013 в 22:30)
 

а что, вы предпочитаете усеять весь свой код конструкциями try/catch?
p.s по поводу первого поста. вы немного не понимаете суть ошибок и суть исключений. вторая функция, которая вам нужна - set_error_handler

  Ответить  
 
 автор: psychomc   (06.04.2013 в 23:02)   письмо автору
 
   для: MHz   (06.04.2013 в 22:03)
 

и почему же?

  Ответить  
 
 автор: MHz   (06.04.2013 в 23:22)   письмо автору
 
   для: psychomc   (06.04.2013 в 23:02)
 

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

  Ответить  
 
 автор: psychomc   (06.04.2013 в 23:47)   письмо автору
 
   для: 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'); 
?>

  Ответить  
 
 автор: MHz   (07.04.2013 в 02:11)   письмо автору
 
   для: psychomc   (06.04.2013 в 23:47)
 

Да каких размеров получиться этот один обработчик, чтобы обрабатывать в нем хотя бы стандартные исключения? Как например пробросить исключение, при этом не зная куда, потому что реализовать это в единственном обработчике невозможно. В общем я даже представить не могу как обрабатывать все в одном обработчике) Абсолютно теряется вся гибкость.

  Ответить  
 
 автор: psychomc   (07.04.2013 в 10:55)   письмо автору
 
   для: 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, а не в обработчике исключения

  Ответить  
 
 автор: MHz   (07.04.2013 в 12:33)   письмо автору
 
   для: psychomc   (07.04.2013 в 10:55)
 

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

  Ответить  
 
 автор: psychomc   (07.04.2013 в 12:38)   письмо автору
 
   для: MHz   (07.04.2013 в 12:33)
 

вообще-то есть. в Exception есть встроенный метод getTrace
*конкретно к объекту нет, да и не нужно. но если уж вдруг понадобится, ничто не мешает дочерние классы написать таким образом, чтобы они принимали объект и при выбросе исключения скармливать им $this. хотел бы я посмотреть на ситуацию, когда после выброса исключения нужно еще что-то делать в контексте класса, который его выбросил

  Ответить  
 
 автор: MHz   (07.04.2013 в 12:49)   письмо автору
 
   для: psychomc   (07.04.2013 в 12:38)
 

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

  Ответить  
 
 автор: psychomc   (07.04.2013 в 12:53)   письмо автору
 
   для: 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");
         }
    }
}


не?

  Ответить  
 
 автор: MHz   (07.04.2013 в 13:15)   письмо автору
 
   для: psychomc   (07.04.2013 в 12:53)
 

И это мне нужно будет везде прописывать вот такие конструкции, а не обрабатывать их как вы сами сказали одинаково для каждого типа исключения?
Да и зачем здесь мне исключение? Чтобы вывести file not exists? проще тогда выбрасывать стандартное exception и не париться.

  Ответить  
 
 автор: psychomc   (07.04.2013 в 13:31)   письмо автору
 
   для: MHz   (07.04.2013 в 13:15)
 

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

  Ответить  
 
 автор: MHz   (07.04.2013 в 13:16)   письмо автору
 
   для: psychomc   (07.04.2013 в 12:53)
 

В общем сомнительное это преимущество все в один обработчик посылать)

  Ответить  
 
 автор: psychomc   (07.04.2013 в 13:32)   письмо автору
 
   для: MHz   (07.04.2013 в 13:16)
 

это не аргумент. приведите пример, когда удобнее использовать try/catch

  Ответить  
 
 автор: MHz   (07.04.2013 в 19:02)   письмо автору
 
   для: psychomc   (07.04.2013 в 13:32)
 

Всегда, когда обработка исключения не ограничивается выводом сообщения об ошибке и логировании.

  Ответить  
 
 автор: psychomc   (07.04.2013 в 19:35)   письмо автору
 
   для: MHz   (07.04.2013 в 19:02)
 

так может все-таки подкрепите свои слова примером?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования