notebook

知ったこと、気になったこと、気づいたことを書き残す。

QueryExceptionのgetCode()はintとは限らないらしい

どういうこと?

以下のようなコードを動かしたらifブロック内に入ってくれなかった。

try {
    // QueryExceptionが出るコード
} catch (QueryException $qe) {
    if ($qe->getCode() === 23000) {  // intの比較
        // ここに入ってほしい
    }
}

公式を覗く

Laravelの公式APIドキュメントには特に情報なし。QueryExceptionクラスはPDOExceptionクラスを継承しているのでそっちのドキュメントを見に行った。

PHP: PDOException - Manual

/ Inherited methods /

...

final public Exception::getCode ( ) : int

intじゃないか/(^o^)\

さらに親のExceptionクラスにgetCode()は定義されてるっぽい。

getCode()は色んな型を返すかもよ!

Exceptionクラスの更にgetCodeメソッドのドキュメントがあった。

PHP: Exception::getCode - Manual

Returns the exception code as int in Exception but possibly as other type in Exception descendants (for example as string in PDOException).

↓翻訳

Exception では例外コードを int として返しますが、Exception の子孫では他のタイプとして (たとえば、PDOException の文字列として) 返す可能性があります。

ちょっと翻訳が変だけどPDOExceptionではstringで返すかもよ!って書いてある。

まとめ

こうしたら無事にifブロック内に入りました。

try {
    // QueryExceptionが出るコード
} catch (QueryException $qe) {
    if ($qe->getCode() === '23000') { // 文字列の比較 
        // やったね!
    }
}

PDOExceptionってPDO(DBの種類意識しないで済むやつ)の機能の一部だからDBによってgetCode()の型が変わったりするのかな。

上記のコードはMySQLの環境で実行してたけど他のDBで試す気力はなかった。。。

==の比較にすればこの辺意識する必要なさそう?動的型付言語の謎は深まるばかり。