例外をcatchしたいけど何もしたくない。
try{
foo();
}catch(Throwable $e){
// 何もしない
}
何もしないのにわざわざ変数に受け取るのって無駄じゃありませんか?
というわけでnon-capturing catchesというRFCが提出されました。
PHP RFC: non-capturing catches
Introduction
今のところ、PHPは例外を明示的に変数でキャプチャする必要があります。
try {
foo();
} catch (SomeException $ex) {
die($ex->getMessage());
}
しかしながら、ときにはその変数を使わない場合もあります。
try {
changeImportantData();
} catch (PermissionException $ex) {
echo "You don't have permission to do this";
}
これを見た人は、プログラマが意図してこの変数を使わなかったのか、あるいはバグなのかがわかりません。
Proposal
例外を変数に受け取らずcatchできるようにします。
try {
changeImportantData();
} catch (PermissionException) { // catchした変数を使わないという意図が明白
echo "You don't have permission to do this";
}
Prior art
7年前にあった似たようなRFCは、以下のように例外名も省略可能にするという理由で否定意見が多数でした。
try {
foo();
} catch {
bar();
}
いっぽう、このRFCは肯定的な反応が多く、再検討の余地があります。
Backward Incompatible Changes
後方互換性を壊す変更はありません。
Proposed PHP Version(s)
PHP8.0
RFC Impact
特になし。
Vote
投票は2020/05/24まで、投票者の2/3の賛成で受理されます。
このRFCは賛成48反対1の圧倒的多数で受理されました。
Patches and Tests
・https://github.com/php/php-src/pull/5345
References
感想
このRFCが意図しているところは決して例外の握り潰しなどではなく、例外処理のロジックに例外の中身を使わないときに省略できるというものです。
変数に受け取る処理がなくなるので速度も速まることでしょう。
しかしですな、こんな機能があったら絶対にこんなコードを書く奴が出てくるわけですよ。
try{
foo();
}catch(Exception){}
いやまあ、こんなの書いてしまう人は今でもやってると思いますけどね。
try{
foo();
}catch(Exception $e){}
なら別にあってもいいか。
劇的に便利になるというわけではないですが、ちょっと気が利く書き方ができるようになりますね。
最後にもう一度言いますが、冒頭のコードは悪い例なので決して真似してはいけません。