<?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 => 'ja',
  ),
  'this' => 
  array (
    0 => 'language.exceptions.php',
    1 => '例外(exceptions)',
    2 => '例外(exceptions)',
  ),
  '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' => 'ja',
    '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">例外(exceptions)</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>
   ブロックが見つかるまで関数のコールスタックを &quot;遡って&quot; いきます。
   その途中で見つかった全ての <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> ブロックが見つからない場合は、
   グローバルな例外ハンドラが設定されていない限り fatal error となり、
   プログラムが終了します。
  </p>
  <p class="para">
   スローされるオブジェクトは、
   <span class="interfacename"><a href="class.throwable.php" class="interfacename">Throwable</a></span> のインスタンスでなければなりません。
   それ以外のオブジェクトをスローしようとすると
   PHP の fatal error が発生します。
  </p>
  <p class="para">
   PHP 8.0.0 以降では、<a href="language.exceptions.php" class="link"><code class="literal">throw</code></a> キーワードは式として扱えるようになり、
   様々なコンテクストで使えるようになりました。
   これより前のバージョンでは、<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> する
    (あるいは <a href="language.exceptions.php" class="link"><code class="literal">throw</code></a> しなおす) こともできます。
    <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> ブロックの後から処理が続けられます。
   </p>
   <p class="para">
    例外がスローされた場合、その命令に続くコードは実行されず、
    PHP は最初にマッチする <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> ブロックを探します。
    例外が捕捉されない場合、PHP は &quot;<code class="literal">Uncaught Exception ...</code>&quot;
    というメッセージとともに
    致命的なエラー(fatal error)を発生させます。
    ただし、<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 以降では、キャッチされた例外に対応する変数はオプションになりました。
    指定されない場合、<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.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#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> および <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> 文の間には注意すべき相互作用があります。
    <a href="function.return.php" class="link"><code class="literal">return</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> ブロックは実行されます。
    さらに、<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> ブロックが実行された後に返されます。
    さらに、<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> 文が存在した場合は、
    <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" 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">
   例外がグローバルスコープにまで遡った場合、
   設定されていれば、グローバルな例外ハンドラがそれをキャッチすることができます。
   他の <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> の代わりに呼び出される関数を
   <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> 関数で設定できます。
   その効果は、プログラム全体を <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>
 </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">エラー報告(error_reporting)</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 /></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 /></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">Standard PHP Library (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 /></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">-&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">"Hello World\n"</span><span style="color: #007700">;<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
捕捉した例外: ゼロによる除算。
Hello World
</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 /></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">-&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">"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">-&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">"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">?&gt;</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-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 /></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 キャッチする時に変数を省略する</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 />    throw new </span><span style="color: #0000BB">SpecificException</span><span style="color: #007700">(</span><span style="color: #DD0000">'Oopsie'</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">"A SpecificException was thrown, but we don't care about the details."</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>
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">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 />    </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">'It did not work'</span><span style="color: #007700">);<br />}<br /><br />function </span><span style="color: #0000BB">do_something_risky</span><span style="color: #007700">() {<br />    return </span><span style="color: #0000BB">false</span><span style="color: #007700">; </span><span style="color: #FF8000">// Simulate failure<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 /></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>
It did not work
</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">'Third'</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">'Fourth'</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">'First'</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">'Second'</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 />}</span></span></code></div>
    </div>

    <div class="example-contents"><p>上の例の出力は以下となります。</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
string(5) &quot;First&quot;
string(6) &quot;Second&quot;
string(5) &quot;Third&quot;
string(6) &quot;Fourth&quot;
</pre></div>
    </div>
   </div>
  </div>

 

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