<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/langref.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'language.exceptions.php',
    1 => 'Исключения',
    2 => 'Исключения',
  ),
  'up' => 
  array (
    0 => 'langref.php',
    1 => 'Справочник языка',
  ),
  'prev' => 
  array (
    0 => 'language.errors.php7.php',
    1 => 'Ошибки в PHP 7',
  ),
  'next' => 
  array (
    0 => 'language.exceptions.extending.php',
    1 => 'Наследование исключений',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/exceptions.xml',
  ),
  'history' => 
  array (
  ),
  'extra_header_links' => 
  array (
    'rel' => 'alternate',
    'href' => '/manual/en/feeds/language.exceptions.atom',
    'type' => 'application/atom+xml',
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.exceptions" class="chapter">
 <h1 class="title">Исключения</h1>
<h2>Содержание</h2><ul class="chunklist chunklist_chapter"><li><a href="language.exceptions.extending.php">Наследование исключений</a></li></ul>

 <p class="para">
  Модель исключений PHP напоминает модель исключений других языков программирования.
  PHP умеет выбрасывать — <a href="language.exceptions.php" class="link"><code class="literal">throw</code></a> — и ловить — <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> — исключения.
  Код заключают в блок <a href="language.exceptions.php" class="link"><code class="literal">try</code></a>, чтобы упростить обработку вероятных исключений.
  Каждому блоку <a href="language.exceptions.php" class="link"><code class="literal">try</code></a> указывают как минимум один блок <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> или <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a>.
 </p>
 <p class="para">
  Исключение будет «всплывать» по стеку вызовов функций, пока не найдёт
  блок <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>, если функция выбросила исключение, а в текущей области
  видимости функции, которая её вызвала, нет блока <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>. PHP выполнит
  каждый блок <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a>, который встретит по пути. Программа завершается
  фатальной ошибкой, когда стек вызовов не встречает блок <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>
  и разворачивается до глобальной области видимости, если разработчик не установил
  глобальный обработчик исключений.
 </p>
 <p class="para">
  В коде допустимо выбрасывать только объект исключения, тип которого при проверке
  оператором <a href="language.operators.type.php" class="link"><code class="literal">instanceof</code></a> соответствует интерфейсу <span class="interfacename"><a href="class.throwable.php" class="interfacename">Throwable</a></span>.
  Попытка выбросить объект, который не выполняет это условие, приведёт к фатальной ошибке PHP.
 </p>
 <p class="para">
  С PHP 8.0.0 ключевое слово <a href="language.exceptions.php" class="link"><code class="literal">throw</code></a> стало выражением, которое разрешили записывать
  в контексте выражения. В предыдущих версиях это слово было инструкцией
  и её записывали в отдельной строке.
 </p>

 <div id="language.exceptions.catch" class="sect1">
  <h2 class="title"><code class="literal">catch</code></h2>
  <p class="para">
   Блок <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> определяет, как реагировать на исключение, которое выбросил код.
   Блок <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> определяет один или больше типов исключений или ошибок, которые он обрабатывает,
   и необязательную переменную, которой блок присвоит исключение.
   До PHP 8.0.0 переменную требовалось указывать.
   Объект исключения обработает первый блок <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>, с которым столкнутся
   исключение или ошибка того типа или подтипа, который ожидает блок.
  </p>
  <p class="para">
   Блоки <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> записывают один за другим, чтобы перехватывать исключения разных классов.
   Нормальное выполнение, когда блок <a href="language.exceptions.php" class="link"><code class="literal">try</code></a> не выбросил исключение,
   продолжится после последнего блока <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>, который определили в последовательности.
   Внутри блока <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> допустимо выбрасывать, а точнее — повторно выбрасывать исключения
   через ключевое слово <a href="language.exceptions.php" class="link"><code class="literal">throw</code></a>. PHP продолжит выполнение кода после блока <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>,
   который сработал, если внутри блока не выбросили исключение.
  </p>
  <p class="para">
   При появлении исключения PHP не выполнит код, который идёт за инструкцией,
   а попытается найти первый подходящий блок <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>. PHP выдаст фатальную ошибку
   с сообщением <code class="literal">Uncaught Exception ...</code>, если исключение не поймали
   и через функцию <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> не определили обработчик исключений.
  </p>
  <p class="para">
   С PHP 7.1.0 в блоке <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> допустимо указывать исключения
   через символ вертикальной черты <code class="literal">|</code>. Это полезно, когда разные исключения
   из разных иерархий классов обрабатывают одинаково.
  </p>
  <p class="para">
   С PHP 8.0.0 имя переменной для исключения, которое поймал блок, необязательно. PHP выполнит
   блок <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>, но у блока не будет доступа к объекту, который выбросил код, если переменную не указали.
  </p>
 </div>

 <div id="language.exceptions.finally" class="sect1">
  <h2 class="title"><code class="literal">finally</code></h2>
  <p class="para">
   Блок <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a> также допустимо указывать после или вместо блоков <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>.
   PHP выполнит код в блоке <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a> после блоков <a href="language.exceptions.php" class="link"><code class="literal">try</code></a> и <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>,
   независимо от того, выбросил ли код исключение, и до возобновления нормального выполнения.
  </p>
  <p class="para">
   Заслуживает внимания взаимодействие между блоком <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a> и инструкцией <a href="function.return.php" class="link"><code class="literal">return</code></a>.
   PHP выполнит блок <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a>, даже если встретит внутри блоков <a href="language.exceptions.php" class="link"><code class="literal">try</code></a> или <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>
   инструкцию <a href="function.return.php" class="link"><code class="literal">return</code></a>. Больше того, когда PHP встречает инструкцию <a href="function.return.php" class="link"><code class="literal">return</code></a>,
   он вычисляет её, но вернёт результат после выполнения блока <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a>.
   Кроме того, PHP вернёт значение из блока <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a>, если блок <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a> тоже
   содержит инструкцию <a href="function.return.php" class="link"><code class="literal">return</code></a>.
  </p>
   <p class="para">
    Другое примечательное взаимодействие встречается между исключениями, которые сгенерировали и блок <a href="language.exceptions.php" class="link"><code class="literal">try</code></a>,
    и блок <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a>. При генерации исключения обоими блоками
    исключение блока <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a> продолжит всплывать,
    а исключение блока <a href="language.exceptions.php" class="link"><code class="literal">try</code></a> станет предыдущим исключением для исключения финального блока.
   </p>
 </div>

 <div id="language.exceptions.exception-handler" class="sect1">
  <h2 class="title">Глобальный обработчик исключений</h2>
  <p class="para">
   Глобальный обработчик исключений, если обработчик установили, перехватит исключение,
   если исключению разрешили всплывать до глобальной области видимости.
   Функция <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> устанавливает callback-функцию,
   которую PHP вызовет вместо блока <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>, если в коде не вызвали другие блоки.
   Эффект по существу такой же, как если бы всю программу обернули в блок <a href="language.exceptions.php" class="link"><code class="literal">try</code></a>-<a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>
   с этой функцией в качестве <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>.
  </p>
 </div>

 <div id="language.exceptions.notes" class="sect1">
  <h2 class="title">Примечания</h2>

  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Внутренние функции PHP чаще сообщают об ошибках через
    <a href="errorfunc.configuration.php#ini.error-reporting" class="link">отчёт об ошибках</a>,
    только современные <a href="language.oop5.php" class="link">объектно-ориентированные</a>
    модули работают с исключениями. При этом ошибки легко переводятся в исключения
    через класс <a href="class.errorexception.php" class="link">ErrorException</a>.
    Эта техника, однако, работает только с нефатальными ошибками.
   </p>
   <div class="example" id="example-1">
    <p><strong>Пример #1 Преобразование отчётов об ошибках в исключения</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">exceptions_error_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$severity</span><span style="color: #007700">, </span><span style="color: #0000BB">$message</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$lineno</span><span style="color: #007700">) {<br />    throw new </span><span style="color: #0000BB">ErrorException</span><span style="color: #007700">(</span><span style="color: #0000BB">$message</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">$severity</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$lineno</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">set_error_handler</span><span style="color: #007700">(</span><span style="color: #DD0000">'exceptions_error_handler'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p></blockquote>
  <div class="tip"><strong class="tip">Подсказка</strong>
   <p class="para">
    <a href="book.spl.php#intro.spl" class="link">Стандартная библиотека PHP (SPL)</a>
    предлагает много <a href="spl.exceptions.php" class="link">встроенных исключений</a>.
   </p>
  </div>
 </div>

 <div id="language.exceptions.examples" class="sect1">
  <h2 class="title">Примеры</h2>

  <div class="example" id="example-2">
   <p><strong>Пример #2 Выброс исключения</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">inverse</span><span style="color: #007700">(</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />    if (!</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />        throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Деление на ноль.'</span><span style="color: #007700">);<br />    }<br />    return </span><span style="color: #0000BB">1 </span><span style="color: #007700">/ </span><span style="color: #0000BB">$x</span><span style="color: #007700">;<br />}<br /><br />try {<br />    echo </span><span style="color: #0000BB">inverse</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">inverse</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />} catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'PHP перехватил исключение: '</span><span style="color: #007700">,  </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(), </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Продолжить выполнение<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Привет, мир\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

   <div class="example-contents screen">
<div class="cdata"><pre>
0.2
PHP перехватил исключение: Деление на ноль.
Привет, мир
</pre></div>
   </div>
  </div>
  <div class="example" id="example-3">
   <p><strong>Пример #3 Обработка исключений в блоке <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a></strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">inverse</span><span style="color: #007700">(</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />    if (!</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />        throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Деление на ноль.'</span><span style="color: #007700">);<br />    }<br />    return </span><span style="color: #0000BB">1 </span><span style="color: #007700">/ </span><span style="color: #0000BB">$x</span><span style="color: #007700">;<br />}<br /><br />try {<br />    echo </span><span style="color: #0000BB">inverse</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />} catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'PHP перехватил исключение: '</span><span style="color: #007700">,  </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(), </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />} finally {<br />    echo </span><span style="color: #DD0000">"Первый блок finally.\n"</span><span style="color: #007700">;<br />}<br /><br />try {<br />    echo </span><span style="color: #0000BB">inverse</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />} catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'PHP перехватил исключение: '</span><span style="color: #007700">,  </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(), </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />} finally {<br />    echo </span><span style="color: #DD0000">"Второй блок finally.\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Продолжить выполнение<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Привет, мир\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

   <div class="example-contents screen">
<div class="cdata"><pre>
0.2
Первый блок finally.
PHP перехватил исключение: Деление на ноль.
Второй блок finally.
Привет, мир
</pre></div>
   </div>
  </div>
  <div class="example" id="example-4">
   <p><strong>Пример #4 Взаимодействие между блоками <a href="language.exceptions.php#language.exceptions.finally" class="link"><code class="literal">finally</code></a> и <a href="function.return.php" class="link"><code class="literal">return</code></a></strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">() {<br />    try {<br />        throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'foo'</span><span style="color: #007700">);<br />    } catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />        return </span><span style="color: #DD0000">'catch'</span><span style="color: #007700">;<br />    } finally {<br />        return </span><span style="color: #DD0000">'finally'</span><span style="color: #007700">;<br />    }<br />}<br /><br />echo </span><span style="color: #0000BB">test</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

   <div class="example-contents screen">
<div class="cdata"><pre>
finally
</pre></div>
   </div>
  </div>
  <div class="example" id="example-5">
   <p><strong>Пример #5 Вложенные исключения</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyException </span><span style="color: #007700">extends </span><span style="color: #0000BB">Exception </span><span style="color: #007700">{ }<br /><br />class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">testing</span><span style="color: #007700">() {<br />        try {<br />            try {<br />                throw new </span><span style="color: #0000BB">MyException</span><span style="color: #007700">(</span><span style="color: #DD0000">'foo!'</span><span style="color: #007700">);<br />            } catch (</span><span style="color: #0000BB">MyException $e</span><span style="color: #007700">) {<br />                </span><span style="color: #FF8000">// Повторный выброс исключения<br />                </span><span style="color: #007700">throw </span><span style="color: #0000BB">$e</span><span style="color: #007700">;<br />            }<br />        } catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />            </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">());<br />        }<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">testing</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

   <div class="example-contents screen">
<div class="cdata"><pre>
string(4) &quot;foo!&quot;
</pre></div>
   </div>
  </div>
  <div class="example" id="example-6">
   <p><strong>Пример #6 Обработка нескольких исключений в одном блоке catch</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyException </span><span style="color: #007700">extends </span><span style="color: #0000BB">Exception </span><span style="color: #007700">{ }<br /><br />class </span><span style="color: #0000BB">MyOtherException </span><span style="color: #007700">extends </span><span style="color: #0000BB">Exception </span><span style="color: #007700">{ }<br /><br />class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">testing</span><span style="color: #007700">() {<br />        try {<br />            throw new </span><span style="color: #0000BB">MyException</span><span style="color: #007700">();<br />        } catch (</span><span style="color: #0000BB">MyException </span><span style="color: #007700">| </span><span style="color: #0000BB">MyOtherException $e</span><span style="color: #007700">) {<br />            </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$e</span><span style="color: #007700">));<br />        }<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$foo </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">testing</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

   <div class="example-contents screen">
<div class="cdata"><pre>
string(11) &quot;MyException&quot;
</pre></div>
   </div>
  </div>
  <div class="example" id="example-7">
   <p><strong>Пример #7 Пример блока <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> без переменной</strong></p>
   <div class="example-contents"><p>
    Разрешено только в PHP 8.0.0 и более поздних версиях.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">SpecificException </span><span style="color: #007700">extends </span><span style="color: #0000BB">Exception </span><span style="color: #007700">{}<br /><br />function </span><span style="color: #0000BB">test</span><span style="color: #007700">() {<br />    throw new </span><span style="color: #0000BB">SpecificException</span><span style="color: #007700">(</span><span style="color: #DD0000">'Ой!'</span><span style="color: #007700">);<br />}<br /><br />try {<br />    </span><span style="color: #0000BB">test</span><span style="color: #007700">();<br />} catch (</span><span style="color: #0000BB">SpecificException</span><span style="color: #007700">) {<br />    print </span><span style="color: #DD0000">"Функция выбросила исключение SpecificException, но детали исключения неважны."</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

    
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

    <div class="example-contents screen">
<div class="cdata"><pre>
A SpecificException was thrown, but we don&#039;t care about the details.
</pre></div>
    </div>
  </div>
  <div class="example" id="example-8">
   <p><strong>Пример #8 Throw как выражение</strong></p>
   <div class="example-contents"><p>
    Разрешено только в PHP 8.0.0 и более поздних версиях.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />{<br />    </span><span style="color: #0000BB">do_something_risky</span><span style="color: #007700">() or throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Функция завершилась ошибкой'</span><span style="color: #007700">);<br />}<br /><br />function </span><span style="color: #0000BB">do_something_risky</span><span style="color: #007700">()<br />{<br />    return </span><span style="color: #0000BB">false</span><span style="color: #007700">; </span><span style="color: #FF8000">// Имитация сбоя<br /></span><span style="color: #007700">}<br /><br />try {<br />    </span><span style="color: #0000BB">test</span><span style="color: #007700">();<br />} catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />    print </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">();<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

    
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

    <div class="example-contents screen">
<div class="cdata"><pre>
Функция завершилась ошибкой
</pre></div>
    </div>
   </div>
   <div class="example" id="example-9">
    <p><strong>Пример #9 Исключение в блоках try и finally</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">try {<br />    try {<br />        throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #0000BB">message</span><span style="color: #007700">: </span><span style="color: #DD0000">'Третье'</span><span style="color: #007700">, </span><span style="color: #0000BB">previous</span><span style="color: #007700">: new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Четвёртое'</span><span style="color: #007700">));<br />    } finally {<br />        throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #0000BB">message</span><span style="color: #007700">: </span><span style="color: #DD0000">'Первое'</span><span style="color: #007700">, </span><span style="color: #0000BB">previous</span><span style="color: #007700">: new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Второе'</span><span style="color: #007700">));<br />    }<br />} catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(<br />        </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(),<br />        </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getPrevious</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(),<br />        </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getPrevious</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">getPrevious</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(),<br />        </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getPrevious</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">getPrevious</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">getPrevious</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(),<br />    );<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

    <div class="example-contents screen">
<div class="cdata"><pre>
string(5) &quot;Первое&quot;
string(6) &quot;Второе&quot;
string(5) &quot;Третье&quot;
string(6) &quot;Четвёртое&quot;
</pre></div>
    </div>
  </div>
 </div>

 

</div>
<?php manual_footer($setup); ?>