PHPのtry-catchってなに?エラーを受け取って処理してみよう

こんにちは、さるまりんです。

プログラムを書いていると、エラーが起きることがあります。

例えば、ファイルを読もうとしたけれどファイルがなかった。
データベースに接続しようとしたけれど、接続できなかった。
想定していない値が渡されてしまった。

いろんなことが起こります。

エラーが起きると、そこで処理が止まってしまうことがあります。

もちろん、止まるべきエラーもあります。

ただ、場合によっては、

「エラーが起きたら、こういう処理をしたい」

ということもあります。

例えば、

「エラーメッセージを表示したい」

「ログに残したい」

「別の処理に切り替えたい」

という感じです。

そんなときに出てくるのが、

try
catch

です。

今回は、PHPの try-catch について、基本の形を見ていきたいと思います。


try-catchってなに?

try-catch は、

例外が起きるかもしれない処理を書いて、失敗したときの処理を受け取るための書き方

です。

まずは形だけ見てみましょう。

try {
    // 例外が起きるかもしれない処理
} catch (Exception $e) {
    // 例外が起きたときの処理
}

try の中には、例外が起きるかもしれない処理を書きます。

catch の中には、例外が起きたときにする処理を書きます。

英語の try は「試す」。
catch は「捕まえる」。

なので、ざっくり言うと、

「まず試してみる」
「失敗したら捕まえる」

という感じですね。


まずは小さな例を見てみましょう

次のコードを見てみます。

<?php

try {
    throw new Exception("エラーが起きました");
} catch (Exception $e) {
    echo "エラーを受け取りました";
}

このコードでは、try の中で、

throw new Exception("エラーが起きました");

と書いています。

throw は、例外を投げるためのものです。

「例外」という言葉が出てくると、ちょっと難しく感じますね。

例外は、プログラムの通常の流れでは処理できない問題が起きたことを知らせる仕組みです。

ここではいったん、

エラーとして扱いたいものを発生させている

くらいに考えておくとよいと思います。

そして、その例外を catch のところで受け取っています。

catch (Exception $e) {
    echo "エラーを受け取りました";
}

そのため、画面には次のように表示されます。

エラーを受け取りました

try の中で起きた例外を、catch が受け取ってくれたというわけです。


catchの中の $e ってなに?

catch の中には、こう書いていました。

catch (Exception $e)

この $e には、起きた例外の情報が入ります。

例えば、エラーメッセージを取り出すこともできます。

<?php

try {
    throw new Exception("ファイルが見つかりません");
} catch (Exception $e) {
    echo $e->getMessage();
}

この場合は、次のように表示されます。

ファイルが見つかりません

getMessage() は、例外に入っているメッセージを取り出すためのメソッドです。

つまり、catch では、

「エラーが起きました」

と受け取るだけではなく、

「どんなエラーだったのか」

を見て処理することもできます。


tryの中に書くものは?

try の中には、

失敗するかもしれない処理

を書きます。

例えば、データベース接続は失敗することがあります。

サーバーが動いていないかもしれません。
ユーザー名やパスワードが間違っているかもしれません。
接続先の情報が間違っているかもしれません。

そういう処理は、try-catch と一緒に書かれることがあります。

<?php

try {
    $pdo = new PDO(
        'mysql:host=localhost;dbname=test;charset=utf8mb4',
        'user',
        'password',
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );

    echo "接続できました";
} catch (PDOException $e) {
    echo "データベースに接続できませんでした";
}

ここでは、データベースに接続できたら、

接続できました

と表示します。

接続に失敗して PDOException が投げられたら、

データベースに接続できませんでした

と表示します。

細かい PDO の話は、ここではいったん置いておきます。

大事なのは、

失敗するかもしれない処理を try に書く

失敗したときの処理を catch に書く

というところです。


try-catchはすべてのエラーを受け取るわけではありません

ここで、ひとつだけ知っておきたいことがあります。

try-catch は、PHPで起きるすべてのエラーを自動的に受け取る仕組みではありません。

try の中で投げられた例外と、catch に指定した型が合うときに、その例外を受け取ります。

最初のうちは、

try の中で起きたことなら、何でも catch できるわけではない」

と覚えておけば大丈夫です。


catchはエラーを消す魔法ではありません

もうひとつ、気をつけたいことがあります。

catch は、エラーをなかったことにするためのものではありません。

エラーが起きたときに、

「どうするか」

を書くためのものです。

例えば、何でもかんでも次のようにしてしまうと、少し危ないです。

<?php

try {
    throw new Exception("大事なエラーです");
} catch (Exception $e) {
    // 何もしない
}

このコードでは、エラーが起きても何も表示されません。

一見すると、問題がなかったように見えるかもしれません。

でも、実際には例外が起きています。

それを何もせずに隠してしまうと、あとから原因が分からなくなることがあります。

なので、catch では、メッセージを表示したり、ログに残したり、ユーザーに分かりやすい案内を出したりします。

ただし、実際に公開するWebサイトでは、詳しいエラー内容をそのまま画面に表示すると、内部情報が見えてしまうことがあります。

開発中は原因を確認し、本番環境ではログに記録しながら、ユーザーには分かりやすいメッセージを表示する、といった使い分けが大切です。

catch は、エラーを消す魔法ではありません。

エラーが起きたあと、どう進むかを決めるための場所

です。


まずは形を覚えておきましょう

最初は、細かいことを全部覚えなくてもいいと思います。

まずは、この形です。

try {
    // 失敗するかもしれない処理
} catch (Exception $e) {
    // 失敗したときの処理
}

try に試したい処理を書く。
catch に失敗したときの処理を書く。

これだけでも、try-catch の雰囲気はつかみやすくなります。

PHPを書いていると、データベース接続やファイル操作などで try-catch を見かけることがあります。

そのときに、

「これは失敗したときの処理を書いているんだな」

と思えれば、少し読みやすくなるはずです。


今回のまとめ

今回は、PHPの try-catch について見てみました。

try には、例外が起きるかもしれない処理を書きます。

catch には、例外が起きたときの処理を書きます。

try {
    // 例外が起きるかもしれない処理
} catch (Exception $e) {
    // 例外が起きたときの処理
}

catch は、エラーをなかったことにするものではありません。

エラーが起きたときに、

「何を表示するか」
「どう記録するか」
「どう処理を続けるか」

を決めるためのものです。

エラーが起きること自体は、めずらしいことではありません。

大切なのは、エラーが起きたときに、どう受け取るか。

try-catch は、そのための書き方のひとつです。

読んでくださってありがとうございました!
それではまた。