mirror of
https://github.com/php/web-php.git
synced 2026-03-23 23:02:13 +01:00
These are all overwritten by the rsync box by executing PhD (docs) & scripts/update-backend (in the master repo)
171 lines
14 KiB
PHP
171 lines
14 KiB
PHP
<?php
|
|
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
|
|
$TOC = 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 => 'ja',
|
|
),
|
|
'this' =>
|
|
array (
|
|
0 => 'language.exceptions.php',
|
|
1 => '例外(exceptions)',
|
|
),
|
|
'up' =>
|
|
array (
|
|
0 => 'langref.php',
|
|
1 => '言語リファレンス',
|
|
),
|
|
'prev' =>
|
|
array (
|
|
0 => 'language.namespaces.faq.php',
|
|
1 => 'FAQ: 名前空間について知っておくべきこと',
|
|
),
|
|
'next' =>
|
|
array (
|
|
0 => 'language.exceptions.extending.php',
|
|
1 => '例外を拡張する',
|
|
),
|
|
'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);
|
|
|
|
manual_header();
|
|
?>
|
|
<div id="language.exceptions" class="chapter">
|
|
<h1>例外(exceptions)</h1>
|
|
<h2>目次</h2><ul class="chunklist chunklist_chapter"><li><a href="language.exceptions.extending.php">例外を拡張する</a></li></ul>
|
|
|
|
|
|
<p class="para">
|
|
PHP 5 は、他のプログラミング言語に似た例外モデルを有しています。
|
|
PHP 内で例外が投げられ ("<em>throw</em>" され)、それが
|
|
捕捉され ("<em>catch</em>" され) ます。発生した例外を
|
|
捕捉するには、コードを <em>try</em> ブロックで囲みます。
|
|
各 <em>try</em> ブロックには、対応する <em>catch</em>
|
|
ブロックが存在する必要があります。異なる型の例外を捕捉するために
|
|
複数の <em>catch</em> フロックを使用することができます。
|
|
通常の実行時 (<em>try</em> ブロック内で例外が投げられなかった
|
|
場合、あるいは投げられた例外に対応する <em>catch</em>
|
|
ブロックが存在しなかった場合) は、<em>catch</em>
|
|
ブロック内は処理されず、それ以降から処理が続けられます。
|
|
<em>catch</em> ブロックの中から例外を投げる
|
|
(あるいは投げなおす) こともできます。
|
|
</p>
|
|
<p class="para">
|
|
例外が投げられた場合、その命令に続くコードは実行されず、
|
|
PHP は最初にマッチする <em>catch</em> ブロックを探します。
|
|
例外が捕捉されない場合、PHP は "<em>Uncaught Exception ...</em>"
|
|
というメッセージとともに
|
|
致命的なエラー(fatal error)を発行します。
|
|
ただし、 <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> でハンドラが
|
|
定義されている場合を除きます。
|
|
</p>
|
|
<p class="para">
|
|
PHP 5.5 以降では、<em>catch</em> ブロックの後に
|
|
<em>finally</em> ブロックも指定できるようになりました。
|
|
<em>finally</em> ブロックの何かに書いたコードは、
|
|
<em>try</em> および <em>catch</em> ブロックの後で常に実行されます。
|
|
例外がスローさされたかどうかには関係ありません。
|
|
<em>finally</em> ブロックを実行してから、通常の処理を続行します。
|
|
</p>
|
|
<p class="para">
|
|
スローされるオブジェクトは、<a href="class.exception.php" class="classname">Exception</a> クラスあるいは
|
|
<a href="class.exception.php" class="classname">Exception</a> のサブクラスのインスタンスでなければなりません。
|
|
それ以外のオブジェクトをスローしようとすると
|
|
PHP の Fatal Error が発生します。
|
|
</p>
|
|
<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>
|
|
</p></blockquote>
|
|
<div class="tip"><strong class="tip">ヒント</strong>
|
|
<p class="para">
|
|
<a href="intro.spl.php" class="link">Standard PHP Library (SPL)</a>
|
|
には<a href="spl.exceptions.php" class="link">組み込みの例外</a>が数多く用意されています。
|
|
</p>
|
|
</div>
|
|
<div class="example" id="example-268">
|
|
<p><strong>例1 例外を投げるには</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">'ゼロによる除算。'</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">'捕捉した例外: '</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">// 実行は継続される<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>上の例の出力は以下となります。</p></div>
|
|
<div class="example-contents screen">
|
|
<div class="cdata"><pre>
|
|
0.2
|
|
捕捉した例外: ゼロによる除算。
|
|
Hello World
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="example" id="example-269">
|
|
<p><strong>例2 例外処理での <em>finally</em> ブロック</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">'ゼロによる除算。'</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">'捕捉した例外: '</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">'捕捉した例外: '</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">// 処理を続行します<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>上の例の出力は以下となります。</p></div>
|
|
<div class="example-contents screen">
|
|
<div class="cdata"><pre>
|
|
0.2
|
|
First finally.
|
|
捕捉した例外: ゼロによる除算。
|
|
Second finally.
|
|
Hello World
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="example" id="example-270">
|
|
<p><strong>例3 ネストした例外</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">// 改めてスロー<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>上の例の出力は以下となります。</p></div>
|
|
<div class="example-contents screen">
|
|
<div class="cdata"><pre>
|
|
string(4) "foo!"
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
<?php manual_footer(); ?>
|