Perlゼミ

  1. Perl
  2. 読み物

なぜPerlで例外処理のfinallyが特に必要と感じないかを考えてみた

Perlでは例外を発生させるにはdieを使います。これはJava言語でいうthrowにあたります。例外をキャッチするにはevalを使用します。これはJava言語でいうcatchにあたります。例外が発生したかどうかは$@にメッセージが設定されたかで判定できます。

# Perlの例外処理

eval {
  # 例外を発生させる処理
}

if ($@) {
  
}

Perlには知ってのとおりfinally文がありません。でも特に困るというような話を聞きません。なぜでしょうか。finally文で実行される処理は、ほとんどの場合、外部リソースの解放です。ファイルを閉じたり、一時ファイルを削除したり、DBへの接続を解放したりする処理です。このような処理をfinally文で実行したいという要望があります。

なぜJavaではfinally文は必須なのでしょうか。JavaではGCが「世代別GC」という仕組みを利用しているために、オブジェクトの解放のタイミングをプログラマが把握することができないからです。Javaではファイナライザでリソースの解放を行ってはいけません。ですからfinnaly文は必須のものになっています。

PerlのGCは単純な参照カウント方式を利用していますから、オブジェクトが解放されたタイミングでデストラクタを確実に実行することができます。この位置にリソースの解放のロジックを記述することができるため、finally文は必須の機能とはされていないと感じます。

またrubyはGCがマークアンドスイープなので、「デストラクタは利用しないように設計すべき」です。ですのでfinally文(Rubyではeusure文)はぜひとも必要な機能になります。

Perlにfinally文がないからといって、大きな不便があるかというとないというのが実感です。ですからPerlの例外処理は駄目で、finallyを実装している例外処理はすばらしいという考え方は妥当な評価ではないと思われます。

Perlの書籍
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
    この私、Perlゼミの作者が執筆しています。
    ご購入、口コミ歓迎。
  • Perlの書籍 »
自己紹介
木本裕紀

「こっ、こしゃくな。
このPerオタクめ~!」

Twitter
フォロー、いいね、リツート、コメント歓迎

Youtube

チャンネル登録、いいね、コメント歓迎

kimoto.yuki@gmail.com
応援メッセージ、質問、間違い報告歓迎

木本システム株式会社
ご紹介キャンペーン実施中です。契約金額の10%をご紹介料としてお支払い。

(例)30万円のシステム開発委託契約が、1年続いたら、36万円がもらえる!!!