例外とエラー処理のチュートリアル

例外とは何ですか?

エラーは、プログラム自体では処理できない予期しないプログラム結果です。

エラーは、プログラムを修正することで解決されます。 エラーの例は、実行を停止しない無限ループです。

例外は、プログラム自体で処理できる予期しないプログラム結果です。

例外の例には、存在しないファイルを開こうとすることが含まれます。

この例外は、ファイルを作成するか、ファイルを検索するオプションをユーザーに提示することで処理できます。

このチュートリアルでは、次のことを学びます-

なぜ例外を処理するのですか?

  • エンドユーザーに非常に迷惑または苛立たしい可能性のある予期しない結果をページに表示しないようにします
  • 悪意のあるユーザーがアプリケーションを攻撃するために使用する可能性のある情報を公開しないことにより、アプリケーションのセキュリティを向上させます
  • PHP例外は、予測可能なエラーが発生した場合にプログラムの通常のフローを変更するために使用されます。

PHPエラー処理

エラーが発生すると、構成設定に応じて、PHPは発生したエラーに関連する情報を含むエラーメッセージをWebブラウザーに表示します。

PHPは、エラーを処理するためのいくつかの方法を提供します。

一般的に使用される3つの方法を見ていきます。

  1. ダイステートメント–ダイ機能は、エコー機能と終了機能を1つにまとめたものです。 メッセージを出力し、エラーが発生したときにスクリプトの実行を停止したい場合に非常に便利です。
  2. カスタムエラーハンドラ –これらは、エラーが発生するたびに呼び出されるユーザー定義関数です。
  3. PHPエラーレポート –PHPエラー報告設定に応じたエラーメッセージ。 この方法は、エラーの原因がわからない開発環境で非常に役立ちます。 表示される情報は、アプリケーションのデバッグに役立ちます。

エラー処理の例

ここで、エラー処理ルーチンを使用したいくつかの簡単な例を見てみましょう。

テキストファイルを使用してデータを保存するアプリケーションを開発したとしましょう。 ファイルからデータを読み取ろうとする前に、ファイルの存在を確認したい場合があります。

以下のコードは、上記の例を実装しています。

<?php
$denominator = 0;
echo 2 / $denominator;
?>

simple_error.phpファイルをphptutsフォルダーに保存したとすると、次のURLを開きます。 http://localhost/phptuts/simple_error.php

次の結果が得られます

上記の結果からわかるように、アプリケーションがプロフェッショナルではないように見え、ユーザーに迷惑をかける可能性があります。

上記のコードを変更し、アプリケーションのエラーハンドラーを記述します

<?php
$denominator = 0;
if ($denominator != 0) {
    echo 2 / $denominator;
} else {
    echo "cannot divide by zero (0)";
}
?>

上記のコードをerror_handling.phpとして保存したと仮定して、URLを開きます http://localhost/phptuts/error_handling.php

注:「ファイルが見つかりません」のようなメッセージを表示するのではなく、上記のようにメッセージを表示することをお勧めします。

カスタムエラーハンドラーを使用する別の例を見てみましょう。

カスタムエラーハンドラーは、デフォルトのPHPエラー処理関数として設定され、基本的にエラー番号とメッセージを表示します。

以下のコードは、上記の例の実装を示しています

<?php
function my_error_handler($error_no, $error_msg)
{
    echo "Opps, something went wrong:";
    echo "Error number: [$error_no]";
    echo "Error Description: [$error_msg]";
}
set_error_handler("my_error_handler");
echo (5 / 0);
?>

URLを開く http://localhost/phptuts/custom_error_handler.php 次の結果が得られます

上記の例からわかるように、カスタムエラーハンドラーは次の意味で強力です。

  • エラーメッセージをカスタマイズできます。
  • カスタムエラーハンドラーには、ファイル/データベースへのエラーロギング、開発者への電子メール送信などを含めることもできます。

次に、3番目のタイプのエラー処理を見てみましょう。 PHPの組み込み関数error_reporting関数を使用します。 次の基本的な構文があります

<?php
error_reporting($reporting_level);
?>

ここに、

  • 「error_reporting」はPHPエラーレポート機能です
  • 「$ reporting_level」はオプションであり、レポートレベルを設定するために使用できます。レポートレベルが指定されていない場合、PHPはphp.iniファイルで指定されているデフォルトのエラーレポートレベルを使用します。
レポートレベル 説明
E_WARNING 警告メッセージのみを表示します。 スクリプトの実行を停止しません error_reporting(E_WARNING);
E_NOTICE プログラムの通常の実行中に発生する可能性がある、またはエラーである可能性がある通知を表示します。 error_reporting(E_ NOTICE);
E_USER_ERROR ユーザー生成エラー、つまりカスタムエラーハンドラーを表示します error_reporting(E_ USER_ERROR);
E_USER_WARNING ユーザーが生成した警告メッセージを表示します error_reporting(E_USER_WARNING);
E_USER_NOTICE ユーザーが生成した通知を表示します error_reporting(E_USER_NOTICE);
E_RECOVERABLE_ERROR 致命的ではなく、カスタムエラーハンドラーを使用して処理できるエラーを表示します error_reporting(E_RECOVERABLE_ERROR);
E_ALL すべてのエラーと警告を表示します error_reporting(E_ ALL);

エラーと例外の違い

  • 例外はスローされ、エラーが通常回復不能である間にキャッチされることを目的としています。
  • 例外はオブジェクト指向の方法で処理されます。

    これは、例外がスローされたときを意味します。 例外の詳細を含む例外オブジェクトが作成されます。

次の表に、例外オブジェクトのメソッドを示します。

方法 説明
getMessage() 例外のメッセージを表示します
<?php
echo $e->getMessage();
?>
コードを取得() 例外を表す数値コードを表示します
<?php
echo $e->getCode();
?>
getFile() 例外が発生したファイル名とパスを表示します
<?php
echo $e->getFile();
?>
getLine() 例外が発生した行番号を表示します
<?php
echo $e->getLine();
?>
getTrace() 例外の前のバックトレースの配列を表示します
<?php
print_r( $e->getTrace());
?>
getPrevious() 現在の例外の前に前の例外を表示します
<?php
echo $e->getPrevious();
?>
getTraceAsString() 例外のバックトレースを配列ではなく文字列として表示します
<?php
echo $e->getTraceAsString();
?>
__toString() 例外全体を文字列として表示します
<?php
echo $e->__toString();
?>

以下は、例外をスローするための基本的な構文です。

<?php
throw new Exception("This is an exception example");
?>

ここに、

  • 「throw」は、例外をスローするために使用されるキーワードです
  • 「newException(…)」は例外オブジェクトを作成し、「これは例外の例です」という文字列をメッセージパラメータとして渡します。

上記のコードは次のメッセージを出力します。

次に、スロー例外とキャッチ例外を実装する例を見ていきます。

上記の例を変更し、try、throw、catchを含めます。

基本的な構文は次のとおりです。

<?php
try {
    //code goes here that could potentially throw an exception
}
catch (Exception $e) {
    //exception handling code goes here
}
?>

ここに、

  • 「try {…}」は、例外を発生させる可能性のある実行されるコードのブロックです。
  • 「catch(Exception $ e){…}」は、スローされた例外をキャッチし、例外オブジェクトを変数$ eに割り当てるコードのブロックです。

以下のコードは、try、throw、catch例外が実装された基本的な例外の例を示しています。

プログラムは意図的に例外をスローし、それをキャッチします。

<?php
try {
    $var_msg = "This is an exception example";
    throw new Exception($var_msg);
}
catch (Exception $e) {
    echo "Message: " . $e->getMessage();
    echo "";
    echo "getCode(): " . $e->getCode();
    echo "";
    echo "__toString(): " . $e->__toString();
}
?>

URLを開く http://localhost/phptuts/exception_handling.php 次の結果が得られます。

スローされる例外のタイプに応じて、1つのphptryステートメントに対して複数の例外を作成することもできます。

複数の例外の実装例については、MySQL、PHPデータアクセスに関する記事を参照してください。

複数の例外

複数の例外は、スローされた例外を処理するために複数のtrycatchブロックを使用します。 複数の例外は、次の場合に役立ちます。

  • スローされた例外に応じてカスタマイズされたメッセージを表示したい
  • スローされた例外に応じて独自の操作を実行したい

以下のフローチャートは、複数の例外がどのように機能するかを示しています

複数の例外を使用する例を見てみましょう。

渡された分母で数値を除算するコードを変更します。

2種類の例外が発生すると予想されます。

  • ゼロ除算
  • 負の数による除算

簡単にするために、catchブロックには例外タイプのみを表示します。

PHPに組み込まれているExceptionクラスは、例外をスローするために使用されます。

例外クラスを拡張する2つのクラスを作成し、それらを使用して例外をスローします。

以下のコードは実装を示しています。

<?php
class DivideByZeroException extends Exception {};
class DivideByNegativeException extends Exception {};
function process($denominator)
{
	try
	{
		if ($denominator == 0)
		{
			throw new DivideByZeroException();
		}
		else if ($denominator < 0)
		{
			throw new DivideByNegativeException();
		}
		else
		{
			echo 25 / $denominator;
		}
	}
	catch (DivideByZeroException $ex)
	{
		echo "DIVIDE BY ZERO EXCEPTION!";
	}
	catch (DivideByNegativeException $ex)
	{
		echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!";
	}
	catch (Exception $x)
	{
	echo "UNKNOWN EXCEPTION!";
	}
}
process(0);
?>

コードのテスト

phptutsフォルダーにmultiple_exceptions.phpを保存したと仮定します。

URLを参照します http://localhost/phptuts/multiple_exceptions.php

次の図に示すように、PHPファイルに戻り、パラメーターとして-1を渡します。

URLを参照します http://localhost/phptuts/multiple_exceptions.php

どのような結果が得られますか? パラメータとして3を渡します。

どのような結果が得られますか?

概要

  • エラーは、PHPコードによって生成される予期しない結果です
  • エラー処理により、アプリケーションのパフォーマンスが向上します
  • PHPには、PHPがエラーを報告する方法をカスタマイズするために使用できる関数が組み込まれています。
  • 例外はエラーのようなものですが、スローされたときにcatchブロックを使用してキャッチできます。
  • エラー情報を示すエラーメッセージを表示することは、悪いセキュリティ慣行と見なされます。

Hope this helps!

Source link