2010-05-14 2 views
2

Что происходит с скриптом php, который выглядит следующим образом?Бесконечное бросание в конструкторе

class FooException extends Exception 
{ 

    public function __construct() { 
     throw new FooException; 
    } 
} 

Это, наверное, такие же, как

while (TRUE) { 
    new Exception(); 
} 

Это просто тайм-ауты, когда время выполнения превышено, или не с какой-то фатальной ошибкой?

+1

Интересный вопрос. Почему бы не попробовать? –

ответ

2

В первом случае ничего не происходит, потому что вы никогда не строите исключение.

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

Однако, если вы измените первый пример, добавив следующую строку в конце:

throw new FooException(); 

Это вызывает бесконечный цикл, который в конечном итоге уничтожает всю память:

 
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 44 bytes) 
+0

Конечно, исключение должно быть брошено раньше, это очевидно. Цикл while был там, как и для демонстрации, однако я должен был указать на это. Спасибо в любом случае, просто хотел знать, проверяет ли php его и терпит неудачу с фатальной ошибкой. –

+0

Интересно, что это приводит к ошибке памяти, а не к максимальной глубине рекурсии .... – selfawaresoup

0

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

EDIT: Хорошо, я был в замешательстве. Вы получаете фатальную ошибку вне памяти:

class FooException extends Exception 
{ 

    public function __construct() { 
     throw new FooException; 
    } 
} 

throw new FooException(); 

То, что я описал, происходит, когда вы генерируете исключение в обработчике исключений.

1

Я попробовал его на PHP 5.2.8 (добавлено the new FooException(); в конце), и заканчивается на счете:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 40 bytes) on line 5

Смежные вопросы