<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.control-structures.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'uk',
  ),
  'this' => 
  array (
    0 => 'control-structures.try-catch.php',
    1 => 'Try...Catch',
    2 => 'Try...Catch',
  ),
  'up' => 
  array (
    0 => 'language.control-structures.php',
    1 => 'Control Structures',
  ),
  'prev' => 
  array (
    0 => 'control-structures.throw.php',
    1 => 'throw',
  ),
  'next' => 
  array (
    0 => 'control-structures.finally.php',
    1 => 'finally',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'en',
    'path' => 'language/control-structures/try-catch.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="control-structures.try-catch" class="sect1">
 <h2 class="title">Try...Catch</h2>
 <div class="sect2" id="control-structures.try">
  <h3 class="title">try</h3>
  <p class="verinfo">(No version information available, might only be in Git)</p>
  <p class="simpara">
   A <a href="control-structures.try-catch.php#control-structures.try" class="link"><code class="literal">try</code></a> block delimits a segment of code which might <a href="control-structures.throw.php" class="link"><code class="literal">throw</code></a>
   a <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span> error that needs handling.
   A <a href="control-structures.try-catch.php#control-structures.try" class="link"><code class="literal">try</code></a> block <em>must</em> have at least one corresponding
   <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> or <a href="control-structures.finally.php" class="link"><code class="literal">finally</code></a> block.
  </p>
  <p class="simpara">
   When a <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span> error is thrown in a <a href="control-structures.try-catch.php#control-structures.try" class="link"><code class="literal">try</code></a> block
   PHP will attempt to find the first matching <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block to handle the
   error. If none can be found, it will unwind the call stack until one is found or a global error handler is reached.
  </p>
  <blockquote class="note"><p><strong class="note">Зауваження</strong>: 
   <p class="simpara">
    It&#039;s possible to add a handler for any uncaught
    <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span> with
    <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span>.
    This is similar to wrapping the entire code in a <a href="control-structures.try-catch.php#control-structures.try" class="link"><code class="literal">try</code></a>-<a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block.
   </p>
  </p></blockquote>
 </div>
 <div class="sect2" id="control-structures.catch">
  <h3 class="title">catch</h3>
  <p class="verinfo">(No version information available, might only be in Git)</p>
  <p class="simpara">
   A <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block defines how to respond to a thrown <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span> error.
   It specifies one or more subclasses of <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span>
   (most commonly <span class="exceptionname"><a href="class.exception.php" class="exceptionname">Exception</a></span>) it can handle, and
   optionally a variable to which to assign the exception.
  </p>
  <p class="simpara">
   The first <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block
   that matches the class of the thrown <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span>
   object will handle the error.
   Normal execution resumes after the <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block without entering any other matching <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> blocks.
  </p>
  <div class="example" id="example-1">
   <p><strong>Приклад #1 Catching an Exception</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">try {
    throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'Error'</span><span style="color: #007700">);
} catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {
    echo </span><span style="color: #DD0000">'Caught exception: '</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">;
}

</span><span style="color: #FF8000">// Continue execution
</span><span style="color: #007700">echo </span><span style="color: #DD0000">"Hello World\n"</span><span style="color: #007700">;</span></code></pre></div>
   </div>

   <div class="example-contents"><p>Поданий вище приклад
виведе:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Caught exception: Error
Hello World
</pre></div>
   </div>
  </div>

  <p class="simpara">
   As of PHP 7.1.0, a <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block may specify a union of
   <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span> subclasses that the block should handle
   using the pipe (<code class="literal">|</code>) character. This is useful for when
   different exceptions from different class hierarchies are handled the same.
  </p>
  <div class="example" id="example-2">
   <p><strong>Приклад #2 Catching a union of classes to handle</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</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">{ }

class </span><span style="color: #0000BB">MyOtherException </span><span style="color: #007700">extends </span><span style="color: #0000BB">Exception </span><span style="color: #007700">{ }

class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{
    public function </span><span style="color: #0000BB">testing</span><span style="color: #007700">() {
        try {
            throw new </span><span style="color: #0000BB">MyException</span><span style="color: #007700">();
        } catch (</span><span style="color: #0000BB">MyException </span><span style="color: #007700">| </span><span style="color: #0000BB">MyOtherException $e</span><span style="color: #007700">) {
            </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">));
        }
    }
}

</span><span style="color: #0000BB">$foo </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">;
</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">testing</span><span style="color: #007700">();</span></code></pre></div>
   </div>

   <div class="example-contents"><p>Поданий вище приклад
виведе:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
string(11) &quot;MyException&quot;
</pre></div>
   </div>
  </div>

  <p class="simpara">
   Multiple <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> blocks can be used to handle different classes of
   <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span> errors in different ways.
   Normal execution (when no error is thrown within the <a href="control-structures.try-catch.php#control-structures.try" class="link"><code class="literal">try</code></a> block) will
   continue after that last <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block defined in sequence.
  </p>
  <div class="example" id="example-3">
   <p><strong>Приклад #3 Multiple catch blocks</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">try {
    </span><span style="color: #0000BB">do_something_io_related</span><span style="color: #007700">();
} catch (</span><span style="color: #0000BB">FileNotFoundException $e</span><span style="color: #007700">) {
    </span><span style="color: #FF8000">// Only catch FileNotFoundException and do something in this case
</span><span style="color: #007700">} catch (</span><span style="color: #0000BB">MissingPermissionException $e</span><span style="color: #007700">) {
    </span><span style="color: #FF8000">// Only catch MissingPermissionException and do something different in this case
</span><span style="color: #007700">}</span></code></pre></div>
   </div>

  </div>

  <p class="simpara">
   <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span>s can be <a href="control-structures.throw.php" class="link"><code class="literal">throw</code></a>n (or re-thrown) within a <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block.
   If nothing is thrown, the execution resumes as normal.
  </p>
  <div class="example" id="example-4">
   <p><strong>Приклад #4 Nested Exception</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</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">{ }

class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{
    public function </span><span style="color: #0000BB">testing</span><span style="color: #007700">() {
        try {
            try {
                throw new </span><span style="color: #0000BB">MyException</span><span style="color: #007700">(</span><span style="color: #DD0000">'foo!'</span><span style="color: #007700">);
            } catch (</span><span style="color: #0000BB">MyException $e</span><span style="color: #007700">) {
                </span><span style="color: #FF8000">// rethrow it
                </span><span style="color: #007700">throw </span><span style="color: #0000BB">$e</span><span style="color: #007700">;
            }
        } catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {
            </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">());
        }
    }
}

</span><span style="color: #0000BB">$foo </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">;
</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">testing</span><span style="color: #007700">();</span></code></pre></div>
   </div>

   <div class="example-contents"><p>Поданий вище приклад
виведе:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
string(4) &quot;foo!&quot;
</pre></div>
   </div>
  </div>
  <div class="caution"><strong class="caution">Застереження</strong>
   <p class="simpara">
    Throwing an object inside a <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block will <em>not</em>
    be caught by an adjacent <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block.
   </p>
   <div class="example" id="example-5">
    <p><strong>Приклад #5 Sequential catch blocks</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">class </span><span style="color: #0000BB">A </span><span style="color: #007700">extends </span><span style="color: #0000BB">Exception </span><span style="color: #007700">{}
class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">Exception </span><span style="color: #007700">{}

try {
    throw new </span><span style="color: #0000BB">A</span><span style="color: #007700">;
} catch(</span><span style="color: #0000BB">A $e</span><span style="color: #007700">) {
    throw new </span><span style="color: #0000BB">B</span><span style="color: #007700">;
} catch(</span><span style="color: #0000BB">B</span><span style="color: #007700">) {
    echo </span><span style="color: #DD0000">'Hello'</span><span style="color: #007700">;
}</span></code></pre></div>
    </div>

    <div class="example-contents"><p>Поданий вище приклад виведе щось
схоже на:</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Fatal error: Uncaught B in /in/K8Tl9:9
Stack trace:
#0 {main}
  thrown in /in/K8Tl9 on line 9
</pre></div>
    </div>
   </div>
  </div>

  <p class="simpara">
   As of PHP 8.0.0, the variable name for a caught
   <span class="exceptionname"><a href="class.throwable.php" class="exceptionname">Throwable</a></span> is optional.
   If not specified, the <a href="control-structures.try-catch.php#control-structures.catch" class="link"><code class="literal">catch</code></a> block will still execute but will not
   have access to the thrown object.
  </p>
  <div class="example" id="example-6">
   <p><strong>Приклад #6 Omitting the caught variable</strong></p>
   <div class="example-contents"><p>Only permitted as of PHP 8.0.0.</p></div>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</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">{}

function </span><span style="color: #0000BB">test</span><span style="color: #007700">() {
    throw new </span><span style="color: #0000BB">SpecificException</span><span style="color: #007700">(</span><span style="color: #DD0000">'Oopsie'</span><span style="color: #007700">);
}

try {
    </span><span style="color: #0000BB">test</span><span style="color: #007700">();
} catch (</span><span style="color: #0000BB">SpecificException</span><span style="color: #007700">) {
    print </span><span style="color: #DD0000">"A SpecificException was thrown, but we don't care about the details."</span><span style="color: #007700">;
}</span></code></pre></div>
   </div>

   <div class="example-contents"><p>Поданий вище приклад
виведе:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
A SpecificException was thrown, but we don&#039;t care about the details.
</pre></div>
   </div>
  </div>
 </div>
</div><?php manual_footer($setup); ?>