Ruby: 例外処理
いままで例外処理は特に使う必要性を感じなかったのですが、例外処理を使ってエラーをデバッギングしつつ例外処理の基本を学ぼうと考え、簡単な例外処理を試してみました。以下は、読み込んだデータの形式がファイルの構造にあってるかどうかをテストするものです。xio が FileIO オブジェクト。読み込んだファイルの行数を 6 で割った余りが 1 のときには、読み込んだ行は正規表現 rpath に当てはまる形、ファイル行数の 6 で割った余りが 1 でないときは、読み込んだ行は正規表現 rpatt に当てはまる形となります。したがって、そうでない場合、
ファイルの行数が 6 で割って 1 余るのに、正規表現 rpatt と読み込んだ行が当てはまる場合 (1)
ファイルの行数が 6 で割った余りが 1 以外になるのに、正規表現 rpath と読み込んだ行が当てはまる場合 (2)
の二つが補足すべきエラーです。
begin message = "error in file structure!" raise message if( xio.lineno % 6 == 1 && line =~ rpatt ) # (1) # if data type data in line 1, 7, 13, 19, .... raise message if( xio.lineno % 6 != 1 && line =~ rpath ) # (2) # if meta-data type data in line 2, 3, 4, 5, 6, 8, 9, 10, ... rescue => err p err.class p err.message p err.backtrace p "now line #{xio.lineno} in the reading file" break end
今回はエラーと判定する条件のときに raise message でエラーを「起こし」(あるいはエラーのフラグを立てるというべき?)、エラーが「起こった」場合は、そのエラー内容(のオブジェクト)を rescue => err で、err に詰め込みます。あとは、err の内容を適宜表示するというものです。
ファイル構造がおかしい箇所を判定するのが目的なので、今回は、p "now line #{xio.lineno} in the reading file" でおかしい行番号を表示させて break して終わりという形をとりました。