例外を投げる

「何でも相談して」と言ってくる人は何でも相談できる人と違う。

はじめに・フラグを立てる

『フラグを立てる』はもともとプログラミングで使われる用語です。ご存じのとおりです。「フラグの回収」は違って、これは「伏線の回収」とどこかで混じったものでしょう。

一般化した『フラグを立てる』がプログラミング業界に逆輸入され、いまでは「変数に真と評価できる値を代入する」という意味で使われることがありますが、古来の意味はビット演算のことです。

例外を投げる

さて、次に、これから流行る技術用語『例外を投げる』を紹介します。

  • 『例外を投げる』の背景
  • 『例外を投げる』の実際
  • 『例外を投げる』の一般化

この順でお話ししていきたいと思います。

例外を投げる、の背景

ソフトウェアの開発においては、処理中に発生しうる状態を抜け目なく考えてゆくわけですが、規模が大きくなればより複雑になります。手に負えなくなって抜け漏れが出ます。

そこでソフトウェアの内部を小さな部品に分割することにします。それぞれに「小さくてわかりやすい責任」を負わせることにします。これで設計が明確になりそうです。

小さな部品たちは互いに、何かを頼んだり頼まれたりの依存関係を持ちますが、ここでちょっと問題があります。頼んだことをやってくれない部品にどう配慮すればよいでしょう?

ある部品が頼んだことをやってくれない場合、それを想定して他の部品を設計してゆくべきでしょうか。待ってください、それでは大きくて複雑で手に負えない設計に逆戻りです。

これの解決法が『例外を投げる』になります。例外に対応するから文字どおり「例外」で、部品どうしの依存関係とは「別ライン」で対応されるから「投げる」となります。

例外を投げる、の実際

例外を投げるを一般化した図(1)

ソフトウェアの内部を擬人化しました。緑が通常の頼みごとのライン、オレンジは例外による「別のライン」です。

倉庫係の責任は、倉庫の状況を調べて報告することです。しかし、倉庫の鍵が折れるという想定外の事象が発生したため責任を果たすことができませんでした。そこで例外を投げました。

庶務係は、そもそも倉庫係が「はい」か「いいえ」以外の返答をすることを想定していません。そうして庶務係の業務は小さくわかりやすく設計されているのです。

さて、投げられた例外は、どこへ飛んでゆくのでしょうか?

例外を投げるを一般化した図(2)

ベテラン受付係が例外をキャッチしました。ウェブサービスを利用していて「システムエラー」という画面をご覧になったことが一度はあると思いますが、あれがまさにベテラン受付係の仕事です。

例外を投げる、の一般化

  • なんでも私に報告しなさい、私がなんとかする
  • なにかあったら例外を投げなさい、あとは誰かが何とかする

リーダーのセリフです。どちらのリーダーが好きですか?

前者のリーダーは頼りになりそうです。突破力がありそうです。ただ、心配なことに「コンプライアンス違反」やらかしそうなんです。大事なことを握りつぶしそうなんです。

後者のリーダーは、大事なことを他人に丸投げの頼りにならない人物なのでしょうか。じつは、組織対応すべき問題を正しく心得ている正しい組織人なのかもしれません。

ソフトウェアの仕組み『例外を投げる』は、より安全な組織をつくるために活用できそうです。一本道のレポートラインですべて処理するのではなく「別のライン」を設けておくと良いことがありそうですね。

おわりに

そんなわけで、きっとこれから『例外を投げる』が流行ると信じています。ぜひ使いこなしてください。

最後までお読みいただきありがとうございました。

備考

多くのプログラミング言語で実際に『例外を投げる』と書きます。
例) throw new Exception("message");

同様に例外は「キャッチ」されますが、プログラミング言語Rubyでは「レスキュー」されます。どちらも素敵です。

例外を握りつぶすのはソフトウェアの実装において悪手とされています。プログラマー的にコンプライアンス違反です。

例外にはその要旨とともに、発生時刻や発生場所が記録されています。この情報が事後の調査を容易にします。

初出は note です。