著者
田中 英行
雑誌
夏のプログラミング・シンポジウム2012「ビューティフルコード」報告集
巻号頁・発行日
pp.17-26, 2013-01-11

今日に於いても、プログラマにとってエラーハンドリングは頭の痛い問題である。正しいエラーハンドリングを行うことは、堅牢なソフトウェアを構築する上で大変重要な問題であるが、適切な抽象化が行われてきたとは言い難い状況にある。現在広く用いられている手法としては、古くからのエラーコードによるものと、例外によるものがある。エラーコードによる手法には大きく2つの問題がある。エラー処理のためのコードがコードのあらゆる部分に組み込まれ、コードの見通しが非常に悪くなることと、エラーを無視するのが非常に容易なので、予期せぬエラー処理漏れを犯しやすいことである。一方で例外を用いる方法は、正しいリソース管理とともに用いられる必要がある。メモリの管理をGCに任せた場合でも、GCの管轄外のリソースは正しく処理されないといけない。これを怠れば、多くの場合深刻なバグを引き起こすことになる。このような処理をもれなく記述すると、往々にして例外捕捉のために深いネストが必要となる。例外処理を正しく行うには、例外の正しい伝搬も必要であるが、これをきちんと行うのはかなり面倒なため、いわゆる例外の握りつぶしが横行する結果となるケースも少なくない。いずれの方法でも、エラーを正しく処理できているかどうかは簡単には推論できない。コードをじっくり観察する必要がある。かくして現代のプログラマは、退屈で面倒な、容易に間違いを犯し得る、そして何より「美しく」ないコードを神経をすり減らしながら書かなければならない状況にあり、また、ともすればそれを良しとする風潮すら見受けられる。しかしながらそれは解決できる問題であり、単にプログラミングモデルからくる制限に他ならないと考える。本発表では、モナドによってエラー処理の抽象化を行うための手法を紹介する。それとともにエラー処理に欠くことのできない、リソース管理の抽象化もあわせて紹介する。モナドを用いて、例外処理のための雑多のコードを、いわゆる「モナドの床下配線」によって隠蔽する方法を、実際のHaskellにおける応用例とともに見てゆく。それにより、エラーの通知側とそれを受け取って処理する側が完全に分離され、用途にマッチしたエラーハンドリングを自由に記述できるようになる。最終的に、正しいエラーハンドリングを美しく行えることを示す。