Lesson 13

エラー、例外処理

Lesson 13 Chapter 1
exception

Lesson13ではエラー、例外処理について学習していきます。より良いサービスの提供、被害の未然防止などにおいてエラーや想定外の操作を想定し、開発をする必要があります。

exceptionとは

システム開発ではある程度、エラーに対して予め対策しておくことは可能ですが、開発者も予期しないエラーが発生するケースも多くあります。このような予期しないエラーの対策をする為に、「例外処理」を組み込んでおくことで回避することが可能となります。ここではtry-catch文とexceptionについて学習していきましょう。

try-catch文とException
try{
  // 処理
  throw new Exception();
}catch(Exception $e){
  // 例外処理
}

try-catch文とは

処理に問題がなければtry文が実行され、処理が失敗した場合、catch文が実行されます。

Exceptionとは

エラーが起きた際の詳細内容をExceptionクラスを扱って確認、対応することが可能です。

それでは実際に例を使用しながらtry-catch文、Exceptionの動きを確認していきましょう。

XAMPP > htdocs > Lesson13 > index.php

index.php
<?php

$message = "Hello";

try {

  if (!$message) {
    throw new Exception();
  }

  echo $message;

} catch (Exception $e) {
  echo $e;
}

try文の動作

まずはtry文の動きを確認します。処理が問題なく実行されれば$messageをechoします。

ブラウザ表示
Hello

catch文、Excveptionの動作

では次にcatch文の動きを確認するので、if文の処理が実行されるよう、処理を修正してみます。

index.php
<?php

$message = null;

try {

  if (!$message) {
    throw new Exception();
  }

  echo $message;

} catch (Exception $e) {
  echo $e;
}

こちらは$messageの値が存在しないことからif文の処理が実行され、catch文が実行されるよう誘導し$eがechoされている状態です。このようにエラー内容を確認することが可能です。

ブラウザ表示
Exception in ...Stack trace

しかしこれではまだサービスを利用するユーザーに対してのレスポンスが不十分な為、更にエラーメッセージを渡してあげることができます。下記のように修正してください。

index.php
<?php

$message = null;

try {

  if (!$message) {
    // 追記→"予期せぬエラーが発生しました。"
    throw new Exception("予期せぬエラーが発生しました。");
  }

  echo $message;
} catch (Exception $e) {
  // 追記→getMessage()
  echo $e->getMessage();
}

Exceptionクラスの引数にエラーメッセージを渡し、getMesseage関数を用いることで、引数に渡した情報を表示することが可能です。尚、getMessage関数はPHP側で元々用意されている関数になります。

ブラウザ表示
予期せぬエラーが発生しました。

try-catch文とExceptionは使用頻度も高いので、この機会に覚えておきましょう。

try-catch文とExceptionのまとめ

  • 予期せぬエラーに備えて使用する例外処理のこと。
  • 処理が成功すればtry文が実行され、失敗すればcatch文が実行される。
  • Exceptionクラスを用いることで、エラー内容の確認やエラーメッセージの表示ができる。

Lesson 13 Chapter 2
error_log

続いてはerror_log関数について学習していきます。例えば、公開しているサービス上で何らかのエラーが発生した場合、「どこでどのようなエラーが発生したのか」を素早く特定し対応する必要があります。error_log関数を使用することで、エラーの検知やエラーに対しての対応などデバッグとして使用することが可能になります。

error_log
error_log(出力内容, オプション, 出力先)

例をもとに学習していきます。chapter1で使用したファイルに追記しましょう。

XAMPP > htdocs > Lesson13 > index.php

index.php
<?php

// 追記①
ini_set('log_errors', 'On');
// 追記②
ini_set('error_log', "/exception.log");

$message = null;

try {

  if (!$message) {
    throw new Exception("予期せぬエラーが発生しました。");
  }

  echo $message;
} catch (Exception $e) {

  // 追記③
  $filePath = dirname(__FILE__) . '/exception.log';

  // 追記④
  error_log($e . "\n", 3, $filePath);

  echo $e->getMessage();
}

今回は追記箇所も多く見慣れない関数も多く登場した為、番号に沿って解説していきます。その前に「ini_set」を使用している部分については、php.iniファイルの設定を変更する関数になります。php.iniの記述を直接変更しても構いませんが、今回はテストも含めて確認するため該当ファイルのみ設定内容を変更しています。

php.iniとは

PHPの設定が記されているファイルのこと。

XAMPPをインストールした際に準備されている。(XAMPP > etc > php.ini)

①エラーのログを確認する為、php.iniのlog_errorsをOnに切り替えています。

②エラーのログ出力先をexception.logファイルへ出力するよう設定を変更しています。

③exception.logファイルのパスを取得しています。又、「dirname(__FILE__)」は現在のパスを表しています。(イメージがわかない場合は、var_dump($filePath)で確認してみてください。)

④error_log関数を使用してエラー内容の出力先を指定し出力します。

※「exception.log」ファイルはchapter3で作成します。

これで準備は完了です。

error_log関数について「error_log(出力内容, オプション, 出力先)」

第一引数:出力内容

 今回はエラー内容を表示する為、$eを設定。

第二引数:オプション

  • 「0」デフォルトの場所に出力。XAMPP > logs > error_log
  • 「1」メールを通じてエラーメッセージを送信。
  • 「3」指定されたファイルへエラーメッセージの出力。

第三引数:出力先

 エラーメッセージを出力したいファイルパスを設定。

error_log関数の出力先を任意ではなく、デフォルトで使用する場合は上記の①〜③の記述は不要で下記のみでも出力は可能です。

index.php
error_log($e, 0)

Lesson 13 Chapter 3
エラーログの確認

それでは実際にエラーログの確認を行っていきます。今回はデフォルトのファイルではなく、外部ファイルへエラーログの出力を行うため、下記構成でファイルを作成してください。

XAMPP > htdocs > Lesson13 > exception.log

尚、exception.phpはエラーを出力する場所のため、何も記入する必要はありません。ブラウザの更新を行ってみましょう。

ブラウザ表示
予期せぬエラーが発生しました。
exception.log
Exception: 予期せぬエラーが発生しました。 in ...

成功すればcatch文が実行されると同時にexception.logへエラーログが出力されます。

エラー:failed to open stream: Permission denied in...と表示される場合

まずこれまでの記述内容に誤りはないか、ファイルのパスは適切であるかを確認してください。それでも解決しない場合「Permission」とは権限に関するエラーなので、下記手順で権限を変更していきます。

①コマンドプロンプト、又はVScodeでターミナルを起動し下記コマンドで現在のディレクトリへ移動します。

コマンドプロンプト、又はターミナル
cd /Applications/XAMPP/xamppfiles/htdocs/Lesson10

②権限情報を確認するためコマンドを実行します。

コマンドプロンプト、又はターミナル
ls -l

③コマンドの結果が表示されます。

コマンドプロンプト、又はターミナル
-rw-r--r--  1 所有者  グループ  ファイルサイズ  タイムスタンプ exception.log
-rw-r--r--  1 所有者  グループ  ファイルサイズ  タイムスタンプ index.php

④「-rw-r--r--」が権限情報になるので、下記コマンドを実行し変更していきます。

コマンドプロンプト、又はターミナル
sudo chmod 777 /Applications/XAMPP/xamppfiles/htdocs/Lesson10/exception.log
コマンドプロンプト、又はターミナル
sudo chmod 777 /Applications/XAMPP/xamppfiles/htdocs/Lesson10/index.php

⑤再度、権限情報を確認するためコマンドを実行します。

コマンドプロンプト、又はターミナル
ls -l

⑥ls -l実行結果

コマンドプロンプト、又はターミナル
-rwxrwxrwx  1 所有者  グループ  ファイルサイズ  タイムスタンプ exception.log
-rwxrwxrwx  1 所有者  グループ  ファイルサイズ  タイムスタンプ index.php

これで権限の変更は完了です。再度ブラウザを更新するとPermissionエラーは解消され、exception.phpへエラーログが出力されます。

error_logのまとめ

  • error_log関数をシステムに組み込むことで、エラーの詳細内容を確認することができる。
  • error_log関数は任意のファイルにエラーログを出力することができる。