B390 例外処理の基本

プログラムを実行する際にエラーが起こることがあります。通常はエラーが起こった際、そこでプログラムは止まりますが、エラーが起こってもプログラムに止まって欲しくない場合もあります。今回はその際に用いる構文について紹介します。

例外処理とは

例外処理とは、プログラムに異常が発生した場合に現在の処理を中断し、別の処理を行わせる処理のことをいいます。

例題処理の際に用いる構文

try-catch文

try-catch文は try{処理A}catch(Exception $e){処理Aでエラーが起きた際に行う処理} という形で記載します。引数eにはエラーメッセージが格納されます。PHPではエラー内容によって出力レベルが設定されています。 catch するエラーレベルや引数eにわたすエラーメッセージをカスタマイズしたい場合はset_error_handler関数を用います。

PHP
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    if (!(error_reporting() & $errno)) {
        return;
    }
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});

try {
//処理A
} catch (Exception $e) {
//処理Aでエラーが起きた際に行う処理
};

set_error_handler関数の詳細はこちら

PHP
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    if (!(error_reporting() & $errno)) {
        return;
    }
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});

try {
  echo $name;
  echo 'こんにちは';
} catch (Exception $e) {
  echo 'こんばんは';
};

出力結果

PHP
こんばんは

変数nameを定義していないので本来エラーになるはずですが、エラー時の例外処理をcatchブロックの中に記載しているのでそちらが処理されます。

finally文

finally文は try{処理A}catch(Exception $e){処理Aでエラーが起きた際に行う処理} finally{最後に実行を行う処理} という形で記載します。finallyブロックは例外が発生してもしなくても実行されます。

PHP
try {
  処理A
} catch (Exception $e) {
  処理B
} finally {
  処理C
}

PHP
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    if (!(error_reporting() & $errno)) {
        return;
    }
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});

try {
  echo $name;
  echo 'こんにちは';
} catch (Exception $e) {
  echo 'こんばんは';
} finally {
  echo 'finally文';
}

出力結果

PHP
こんばんはfinally文

上記の場合、tryのブロッック内処理でエラーとなるため、Exceptionをcatchしたブロック内の処理が実行された後にfinallyブロック内の処理が実行されます。

throw文

throw文は throw 発生させる例外の式; という形で記載します。

PHP
$point = 1;
try{
  if ($point < 50){
    throw new Exception('エラー!');
  }
  echo '合格です';
} catch(Exception $e) {
  echo $e->getMessage();
}

例題

以下コードの出力値はどれか

PHP
$point = 100;
try{
  if ($point < 50){
    throw new Exception('エラー!');
  }
  echo '合格です';
} catch(Exception $e) {
  echo $e->getMessage();
}
  1. ReferenceError: point is not defined
  2. エラー!!
  3. 合格です
  4. 不合格です
回答

3. 合格です
変数pointは50より大きいのでエラーは出ず、合格が出力されるため。

---