PHP - 文法 - 例外

クラウディア 
1. 概要
2. 例外処理

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);
	}
}
 のように、オープンできたかどうかのチェックをいれます。
ハイスピードプラン