<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Exceptions</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.errors.php7.html">Errors in PHP 7</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.exceptions.extending.html">Extending Exceptions</a></div> <div class="up"><a href="langref.html">Language Reference</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="language.exceptions" class="chapter"> <h1>Exceptions</h1> <h2>Table of Contents</h2><ul class="chunklist chunklist_chapter"><li><a href="language.exceptions.extending.html">Extending Exceptions</a></li></ul> <div class="simplesect"> <p class="para"> PHP 5 has an exception model similar to that of other programming languages. An exception can be <a href="language.exceptions.html" class="link"><em>throw</em></a>n, and caught ("<a href="language.exceptions.html#language.exceptions.catch" class="link"><em>catch</em></a>ed") within PHP. Code may be surrounded in a <a href="language.exceptions.html" class="link"><em>try</em></a> block, to facilitate the catching of potential exceptions. Each <a href="language.exceptions.html" class="link"><em>try</em></a> must have at least one corresponding <a href="language.exceptions.html#language.exceptions.catch" class="link"><em>catch</em></a> or <a href="language.exceptions.html#language.exceptions.finally" class="link"><em>finally</em></a> block. </p> <p class="para"> The thrown object must be an instance of the <a href="class.exception.html" class="classname">Exception</a> class or a subclass of <a href="class.exception.html" class="classname">Exception</a>. Trying to throw an object that is not will result in a PHP Fatal Error. </p> </div> <div class="simplesect"> <h3 class="title"><em>catch</em></h3> <p class="para"> Multiple <a href="language.exceptions.html#language.exceptions.catch" class="link"><em>catch</em></a> blocks can be used to catch different classes of exceptions. Normal execution (when no exception is thrown within the <a href="language.exceptions.html" class="link"><em>try</em></a> block) will continue after that last <a href="language.exceptions.html#language.exceptions.catch" class="link"><em>catch</em></a> block defined in sequence. Exceptions can be <a href="language.exceptions.html" class="link"><em>throw</em></a>n (or re-thrown) within a <a href="language.exceptions.html#language.exceptions.catch" class="link"><em>catch</em></a> block. </p> <p class="para"> When an exception is thrown, code following the statement will not be executed, and PHP will attempt to find the first matching <a href="language.exceptions.html#language.exceptions.catch" class="link"><em>catch</em></a> block. If an exception is not caught, a PHP Fatal Error will be issued with an "<em>Uncaught Exception ...</em>" message, unless a handler has been defined with <span class="function"><a href="function.set-exception-handler.html" class="function">set_exception_handler()</a></span>. </p> <p class="para"> In PHP 7.1 and later, a <a href="language.exceptions.html#language.exceptions.catch" class="link"><em>catch</em></a> block may specify multiple exceptions using the pipe (<em>|</em>) character. This is useful for when different exceptions from different class hierarchies are handled the same. </p> </div> <div class="simplesect"> <h3 class="title"><em>finally</em></h3> <p class="para"> In PHP 5.5 and later, a <a href="language.exceptions.html#language.exceptions.finally" class="link"><em>finally</em></a> block may also be specified after or instead of <a href="language.exceptions.html#language.exceptions.catch" class="link"><em>catch</em></a> blocks. Code within the <a href="language.exceptions.html#language.exceptions.finally" class="link"><em>finally</em></a> block will always be executed after the <a href="language.exceptions.html" class="link"><em>try</em></a> and <a href="language.exceptions.html#language.exceptions.catch" class="link"><em>catch</em></a> blocks, regardless of whether an exception has been thrown, and before normal execution resumes. </p> </div> <div class="simplesect"> <h3 class="title">Notes</h3> <blockquote class="note"><p><strong class="note">Note</strong>: <p class="para"> Internal PHP functions mainly use <a href="errorfunc.configuration.html#ini.error-reporting" class="link">Error reporting</a>, only modern <a href="language.oop5.html" class="link">Object oriented</a> extensions use exceptions. However, errors can be simply translated to exceptions with <a href="class.errorexception.html" class="link">ErrorException</a>. </p> </p></blockquote> <div class="tip"><strong class="tip">Tip</strong> <p class="para"> The <a href="intro.spl.html" class="link">Standard PHP Library (SPL)</a> provides a good number of <a href="spl.exceptions.html" class="link">built-in exceptions</a>. </p> </div> </div> <div class="simplesect"> <h3 class="title">Examples</h3> <div class="example" id="example-280"> <p><strong>Example #3 Throwing an Exception</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<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">'Division by zero.'</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">'Caught exception: '</span><span style="color: #007700">, </span><span style="color: #0000BB">$e</span><span style="color: #007700">-></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">// Continue execution<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Hello World\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> 0.2 Caught exception: Division by zero. Hello World </pre></div> </div> </div> <div class="example" id="example-281"> <p><strong>Example #4 Exception handling with a <em>finally</em> block</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<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">'Division by zero.'</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">'Caught exception: '</span><span style="color: #007700">, </span><span style="color: #0000BB">$e</span><span style="color: #007700">-></span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(), </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />} </span><span style="color: #0000BB">finally </span><span style="color: #007700">{<br /> echo </span><span style="color: #DD0000">"First 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">'Caught exception: '</span><span style="color: #007700">, </span><span style="color: #0000BB">$e</span><span style="color: #007700">-></span><span style="color: #0000BB">getMessage</span><span style="color: #007700">(), </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />} </span><span style="color: #0000BB">finally </span><span style="color: #007700">{<br /> echo </span><span style="color: #DD0000">"Second finally.\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Continue execution<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Hello World\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> 0.2 First finally. Caught exception: Division by zero. Second finally. Hello World </pre></div> </div> </div> <div class="example" id="example-282"> <p><strong>Example #5 Nested Exception</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?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">// rethrow it<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">-></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">-></span><span style="color: #0000BB">testing</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> string(4) "foo!" </pre></div> </div> </div> <div class="example" id="example-283"> <p><strong>Example #6 Multi catch exception handling</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?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">-></span><span style="color: #0000BB">testing</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> string(11) "MyException" </pre></div> </div> </div> </div> </div> <hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.errors.php7.html">Errors in PHP 7</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.exceptions.extending.html">Extending Exceptions</a></div> <div class="up"><a href="langref.html">Language Reference</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>