QueryExceptionのgetCode()はintとは限らないらしい
どういうこと?
以下のようなコードを動かしたらifブロック内に入ってくれなかった。
try { // QueryExceptionが出るコード } catch (QueryException $qe) { if ($qe->getCode() === 23000) { // intの比較 // ここに入ってほしい } }
公式を覗く
Laravelの公式APIドキュメントには特に情報なし。QueryExceptionクラスはPDOExceptionクラスを継承しているのでそっちのドキュメントを見に行った。
/ 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で試す気力はなかった。。。
==の比較にすればこの辺意識する必要なさそう?動的型付言語の謎は深まるばかり。