mirror of
https://github.com/php/web-php.git
synced 2026-03-24 07:12:16 +01:00
165 lines
13 KiB
PHP
165 lines
13 KiB
PHP
<?php
|
|
include_once __DIR__ . '/../../include/shared-manual.inc';
|
|
$TOC = array();
|
|
$PARENTS = array();
|
|
include_once __DIR__ ."/toc/langref.inc";
|
|
$setup = array (
|
|
'home' =>
|
|
array (
|
|
0 => 'index.php',
|
|
1 => 'PHP Manual',
|
|
),
|
|
'head' =>
|
|
array (
|
|
0 => 'UTF-8',
|
|
1 => 'en',
|
|
),
|
|
'this' =>
|
|
array (
|
|
0 => 'language.exceptions.php',
|
|
1 => 'Exceptions',
|
|
),
|
|
'up' =>
|
|
array (
|
|
0 => 'langref.php',
|
|
1 => 'Language Reference',
|
|
),
|
|
'prev' =>
|
|
array (
|
|
0 => 'language.namespaces.faq.php',
|
|
1 => 'FAQ: things you need to know about namespaces',
|
|
),
|
|
'next' =>
|
|
array (
|
|
0 => 'language.exceptions.extending.php',
|
|
1 => 'Extending Exceptions',
|
|
),
|
|
'alternatives' =>
|
|
array (
|
|
),
|
|
'extra_header_links' =>
|
|
array (
|
|
'rel' => 'alternate',
|
|
'href' => '/manual/en/feeds/language.exceptions.atom',
|
|
'type' => 'application/atom+xml',
|
|
),
|
|
);
|
|
$setup["toc"] = $TOC;
|
|
$setup["parents"] = $PARENTS;
|
|
manual_setup($setup);
|
|
|
|
?>
|
|
<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.php">Extending Exceptions</a></li></ul>
|
|
|
|
|
|
<p class="para">
|
|
PHP 5 has an exception model similar to that of other programming languages.
|
|
An exception can be <em>throw</em>n, and caught
|
|
("<em>catch</em>ed") within PHP. Code may be surrounded in a
|
|
<em>try</em> block, to facilitate the catching of potential
|
|
exceptions. Each <em>try</em> must have at least one
|
|
corresponding <em>catch</em> block. Multiple
|
|
<em>catch</em> blocks can be used to catch different classes of
|
|
exceptions. Normal execution (when no exception is thrown within the
|
|
<em>try</em> block, or when a <em>catch</em> matching
|
|
the thrown exception's class is not present) will continue after that last
|
|
<em>catch</em> block defined in sequence. Exceptions can be
|
|
<em>throw</em>n (or re-thrown) within a <em>catch</em> 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
|
|
<em>catch</em> 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.php" class="function">set_exception_handler()</a></span>.
|
|
</p>
|
|
<p class="para">
|
|
In PHP 5.5 and later, a <em>finally</em> block may also be
|
|
specified after the <em>catch</em> blocks. Code within the
|
|
<em>finally</em> block will always be executed after the
|
|
<em>try</em> and <em>catch</em> blocks, regardless of
|
|
whether an exception has been thrown, and before normal execution resumes.
|
|
</p>
|
|
<p class="para">
|
|
The thrown object must be an instance of the <a href="class.exception.php" class="classname">Exception</a>
|
|
class or a subclass of <a href="class.exception.php" class="classname">Exception</a>. Trying to throw an
|
|
object that is not will result in a PHP Fatal Error.
|
|
</p>
|
|
<blockquote class="note"><p><strong class="note">Note</strong>:
|
|
<p class="para">
|
|
Internal PHP functions mainly use
|
|
<a href="errorfunc.configuration.php#ini.error-reporting" class="link">Error reporting</a>, only modern
|
|
<a href="language.oop5.php" class="link">Object oriented</a>
|
|
extensions use exceptions. However, errors can be simply translated to
|
|
exceptions with <a href="class.errorexception.php" class="link">ErrorException</a>.
|
|
</p>
|
|
</p></blockquote>
|
|
<div class="tip"><strong class="tip">Tip</strong>
|
|
<p class="para">
|
|
The <a href="intro.spl.php" class="link">Standard PHP Library (SPL)</a> provides a
|
|
good number of <a href="spl.exceptions.php" class="link">built-in exceptions</a>.
|
|
</p>
|
|
</div>
|
|
<div class="example" id="example-269">
|
|
<p><strong>Example #1 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-270">
|
|
<p><strong>Example #2 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-271">
|
|
<p><strong>Example #3 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>
|
|
<?php manual_footer([]); ?>
|