PHPのエラーとか例外とか考える in 令和 #PHPerKaigi

PHPerKaigi2021に「PHP8になった今の時代に、PHPの「エラー」「例外」そして「Error」をおさらいしておこう」と題して応募したプロポーザルが採択されまして、お話をする機会をいただきました。
その内容について触れるエントリーです。 (今回はLTでもしゃべるよ!!!!!!)

↓プロポーザル fortee.jp

↓ 資料

※ 収録済み・発表前のタイミングで書いています、発表後に何かしらの追記などするかもです

本発表のターゲット

このプロポーザルを投げた時に、「こういう人たちに届けばいいな」というターゲットはざっくり3パターン考えていました。

  1. PHP歴はまだ浅いかな?という人で、「エラーや例外の扱い方ってよくわからない!」という方々
  2. チームのメンバーなどに「Errorとは」「Throwableとは」というのを説明するのに骨が折れている方々
  3. 例外難しいね、どうしたらいいの、理論武装したいのでそのための(参考・批判対象となる)アクセスしやすい資料がほしいという方々

主に「1,2の人に少しでも役立ったら!!」という気持ちですが、3については、「発表者本人も探り探りだから色々な声を聞かせてくれ・・・」という気持ちです。
総じて、これらの方々に興味を持っていただけたら幸いだな、と思っています。

今回の発表を通じて伝えたかったこと

コアとなるメッセージは3つ・・というか、1+2つです。

とにかく不用意に\Throwable, \Errorをキャッチしないでくれ というのが最も言いたいポイントです。
ただし、その1点を単独で・表面的に伝えたところで「押しつけ」になりそうな恐れがありますので、「エラーとは・例外とは・Errorとは」という視点を取り揃えようと試みました。

そこで、第2のメッセージは「意味のある、効果の高い『例外の扱い方』について考えてみませんか?」というものです。

そこから派生し、第3のメッセージとして「PHP自体も、7→8と進化していく中でエラー(warning)やErrorの変化・強化によって開発者体験を引き上げようとしている、その息吹を感じていきたい!」が挙がってきます。

発表時の資料とSpeakerDeck掲載資料の差異

PHPerKaigiの発表収録時には「発表版」を、SpeakerDeckにアップロードしたものは「配布版」となります。
一部、内容に差異があります。 「配布版」は「発表板」の内容に追加・補足を行ったものです。

コンテンツの追加

発表時間の都合で省略した部分を含んでいます。 「§2: エラー、例外のハンドリング」全体と、「$3. PHP7〜PHP8とエラー」内のPHP8関連情報の追加です。

とりわけ後者については、タイトルに「PHP8」というキーワードを含んでいるので発表にも含めたい・・・と思いながら、削った部分でした。
PHP8での変更内容に「お、まじかそれも(遂に)か!!」と感じる内容があるので、取り上げておきたいなーと。
ですが、話の流れ的に「少し浮いていそうかな」と感じたので、発表時には省略することになりました。

また、この部分で挙動変更の実例を示すために3v4lを利用しています。
そのURLと、トリミングする前のキャプチャ全体を↓に貼っておきます。
(資料上ではスペースの都合で強引な切り取り方をしているので、わかりにくそうだなぁと思っています)

Online PHP editor | output for G3MWC

f:id:o0h:20210327023638p:plain

Undefined constantがFatal Error(Uncaught Error)になったのありがてぇ、大好きだ・・・

参考文献の追加

各スライド中と、末尾に「参考」を加えました。
もちろん「参考資料を全て読まないと理解が出来ない」なんてものにしたつもりはないですが、やはり「何かしらのインプットがあって、そこから刺激を受けたり参考にしたりしながら作った」ものなので、そういった「元ネタ」は積極的に開示共有していきたいなーという気持ちでおります。

余談: プロポーザル提出にいたった経緯

このプロポーザルを出す前に書いたエントリーがあります。

daisuki.nichiyoubi.land

根本のモチベーションは、これを書いたときと同じです。
で、全く同じ話をするというのもそそられないので、より俯瞰的に「例外との比較、そもそも例外ってなんだっけ」という部分を考えてみたいなぁと思いながら発表内容を作っていきました。(あとPHP8出たのも追加の面白ポイントになる)

自分の中で「学んでいく中で面白いこと見つけちゃった!!」というよりは、かつて一緒に働いていた仲間に 「Throwbaleをcatchしない方が良いよ、って前に言われたことあるけどアレってソースある?」と言われ たり、今の職場での同僚若手に近い話題の質問を受けたり、というのが契機となりました。

なので、どちらかというと「外発的に動機づけられて、自分でやってみたくなった」という流れになります。自分の中ではちょっと異質です。
前回とかPHP Conferenceなどでは完全に「俺がやりたいから・話したいから」という内発的なモチベだったのと比べると、不思議な感じです。
どちらも面白いものだなぁと感じました。

「何人かに聞かれた話だからまた別のとこでも説明が求められるんじゃないかな」と予感しているので、手軽に投げられるリファレンスを作ったつもり。

余談2: 資料作成時に思ったこと

例外やエラーというのは、取り扱っているのがプログラミングや開発において避けて通れない関心事なので、既に何名もカンファレンスだったりインターネット上で考えを述べているトピックな訳です。
ましてPHP7での「Error」「Throwable」なんてザワザワしましたからね・・・*1

・・・しかも、自分がフォローしていたりコミュニティで名を馳せているような錚々たるエンジニアさんの名前が「過去にやっている」んですよね。
し、実際に自分もそれらの記事や資料にお世話になって、今の知識や思考があるわけで。

じゃあそんな話を自分がする意義どこに。。。。?
とかとか思ったりもしました、平たく言うとプレッシャーを感じた😇

資料の中でもページを割いて「すごい有用な資料があるよ!」という紹介もしておりますので、(マジで)そっちを読んでもらえたらなーと思います。
その上で、折角の場を頂いた立場として、情報を編纂して独自の視点というのも提供したいと試みております。
だたのカット&ペーストではなくて、自分なりの「こうしたい、ああしたい」ていう視点や考えは織り込んだつもり。

今回の発表&公開資料で、誰かに何かしら届けられるものがあったら幸いです。

最後に

ということで、ぜひぜひフィードバックお待ちしております〜!!

*1:https://tech.connehito.com/entry/cakephp-2.8-php7-ready とか思い出すなぁ。Errorが出ました!!って話になると。