From 80f91f55bbba18bf52cd6eaed8a2e031f11df77b Mon Sep 17 00:00:00 2001 From: lacatoire Date: Mon, 31 Aug 2026 13:30:54 +0200 Subject: [PATCH] errorfunc: document the exception handler stack behavior of 8.3.0 and 8.3.5 --- .../functions/restore-exception-handler.xml | 76 ++++++++++++++--- .../functions/set-exception-handler.xml | 82 ++++++++++++++++--- 2 files changed, 138 insertions(+), 20 deletions(-) diff --git a/reference/errorfunc/functions/restore-exception-handler.xml b/reference/errorfunc/functions/restore-exception-handler.xml index dbc1461ffc..b6997271f5 100644 --- a/reference/errorfunc/functions/restore-exception-handler.xml +++ b/reference/errorfunc/functions/restore-exception-handler.xml @@ -1,5 +1,5 @@ - + @@ -21,6 +21,29 @@ которым станет или пользовательская функция обработки исключений, если такую определили, или встроенный обработчик. + + + Пока обработчик исключений выполняется, ни один обработчик исключений + не активен: начиная с PHP 8.3.0 движок снимает обработчик перед вызовом, + чтобы исключение, которое выбросил сам обработчик, не передавалось ему же. + + + Начиная с PHP 8.3.5 движок вдобавок помещает обработчик, который собирается + вызвать, в стек обработчиков. Поэтому вызов функции + restore_exception_handler изнутри обработчика исключений + снимает со стека эту запись и переустанавливает обработчик, который сейчас + выполняется; чтобы установить обработчик, который действовал до него, + требуется второй вызов. + + + Выполняющийся обработчик переустанавливается автоматически, когда он + возвращает управление, но только если в этот момент ни один обработчик + исключений не активен: обработчик, который вызвал функцию + set_exception_handler или + restore_exception_handler, дальше сам отвечает + за стек обработчиков. + + @@ -35,6 +58,41 @@ + + &reftitle.changelog; + + + + + + &Version; + &Description; + + + + + 8.3.5 + + Обработчик исключений, который вызывают, теперь помещается в стек + обработчиков, поэтому вызов функции + restore_exception_handler изнутри обработчика + исключений переустанавливает обработчик, который сейчас выполняется; + чтобы восстановить обработчик, который действовал до него, теперь + требуется два вызова. + + + + 8.3.0 + + Активный обработчик исключений теперь снимается на время его работы. + + + + + + + + &reftitle.examples; @@ -78,15 +136,13 @@ throw new Exception('Эта инструкция запустит первый &reftitle.seealso; - - - set_exception_handler - get_exception_handler - set_error_handler - restore_error_handler - error_reporting - - + + set_exception_handler + get_exception_handler + set_error_handler + restore_error_handler + error_reporting + + @@ -20,6 +20,35 @@ для перехвата исключений, которые не отловили в блоке try-catch. Выполнение скрипта остановится после вызова callback-функции. + + + + Пока обработчик исключений выполняется, ни один обработчик исключений + не активен: начиная с PHP 8.3.0 движок снимает обработчик перед вызовом, + чтобы исключение, которое выбросил сам обработчик, не передавалось ему же. + Поэтому вызванная изнутри обработчика функция + set_exception_handler сообщает, что ранее определённого + обработчика нет. + + + Начиная с PHP 8.3.5 движок вдобавок помещает обработчик, который собирается + вызвать, в стек обработчиков, поэтому вызванная изнутри обработчика функция + restore_exception_handler переустанавливает обработчик, + который сейчас выполняется, а не тот, который действовал до него. + + + Выполняющийся обработчик переустанавливается автоматически, когда он + возвращает управление, но только если в этот момент ни один обработчик + исключений не активен. Как только обработчик вызвал функцию + set_exception_handler или + restore_exception_handler, автоматическое + восстановление пропускается, и активным остаётся тот обработчик, + который оставил сам обработчик. + + + Поэтому менять обработчик исключений изнутри него самого не рекомендуют. + + @@ -62,6 +91,41 @@ + + &reftitle.changelog; + + + + + + &Version; + &Description; + + + + + 8.3.5 + + Обработчик исключений, который вызывают, теперь помещается в стек + обработчиков и переустанавливается, когда он возвращает управление, + если только обработчик сам не изменил стек. + + + + 8.3.0 + + Активный обработчик исключений теперь снимается на время его работы, + поэтому вызванная изнутри обработчика функция + set_exception_handler сообщает, что ранее + определённого обработчика нет. + + + + + + + + &reftitle.examples; @@ -92,15 +156,13 @@ echo "Не выполняется\n"; &reftitle.seealso; - - - get_exception_handler - restore_exception_handler - restore_error_handler - error_reporting - Исключения - - + + get_exception_handler + restore_exception_handler + restore_error_handler + error_reporting + Исключения +