1. 概要
まぁ、いきなりこけちゃっても困るわけで・・・。
本ページは、下記のサイト(本家 ドキュメント)を参考にさせていただきました。
「PHP: 例外(exceptions) - Manual」
2. 例外処理
たいていの他の言語と同じで、「try」「catch」「finally」で構成されます。
わかりにくいのが、「Error」と「Exception」に大別されることです。
<?php
$filename = __DIR__."/xxxx.txt";
try
{
$fp = fopen($filename, "r");
$str = fgets($fp);
print_r($str);
}
catch(Exception $e)
{
print("Exception 例外発生[".$e->getMessage()."]\n");
}
finally
{
if ($fp !== FALSE)
{
fclose($fp);
}
}
てなソースを書いて、オープンするファイルがない場合
PHP Warning: fopen(/オープンするファイルのパス/xxxx.txt): Failed to open stream: No such file or directory in /パス/ソースファイル名.php on line 6
PHP Fatal error: Uncaught TypeError: fgets(): Argument #1 ($stream) must be of type resource, bool given in /パス/ソースファイル名.php:8
Stack trace:
#0 /パス/ソースファイル名.php(8): fgets(false)
#1 {main}
thrown in /パス/ソースファイル名.php on line 8
てな出力結果になりまして、はて?「Uncaught TypeError」とな?
キャッチできないのかえ。
で、参考サイトを熟読して、「Error」は「Exception」と異なる分岐であるということがわかりました。
ということで、前のソースを修正して
<?php
$filename = __DIR__."/xxxx.txt";
try
{
$fp = fopen($filename, "r");
$str = fgets($fp);
print_r($str);
}
catch(Error $e)
{
print("Error 例外発生[".$e->getMessage()."]\n");
}
catch(Exception $e)
{
print("Exception 例外発生[".$e->getMessage()."]\n");
}
finally
{
if ($fp !== FALSE)
{
fclose($fp);
}
}
と記述することで、「Error」の方もキャッチすることができます。
こちらのオープンするファイルが損座視しない場合は、下記のように出力されます。
PHP Warning: fopen(/オープンするファイルのパス/xxxx.txt): Failed to open stream: No such file or directory in /パス/ソースファイル名.php on line 6
Error 例外発生[fgets(): Argument #1 ($stream) must be of type resource, bool given]
下の行は、例外時に意図している出力になっています。
いずれの場合も、「fopen」自体は、こけないので例外は発生せず、ワーニングが出力されるのみというのがわかります。
実際に、記述する場合は
<?php
$filename = __DIR__."/xxxx.txt";
if (($fp = fopen($filename, "r")) === FALSE)
{
print("ファイルオープンエラー[".$filename."]\n");
return;
}
try
{
$str = fgets($fp);
print_r($str);
}
catch(Error $e)
{
print("Error 例外発生[".$e->getMessage()."]\n");
}
catch(Exception $e)
{
print("Exception 例外発生[".$e->getMessage()."]\n");
}
finally
{
if ($fp !== FALSE)
{
fclose($fp);
}
}
のように、オープンできたかどうかのチェックをいれます。