テキストファイルの内容をソートするプログラム その5 「例外処理」

ファイル操作は、例外が発生しやすい処理です。パスが1文字間違っていたためにファイルが見つからない、他のプログラムで使用していたためアクセスできないなど、些細なことが大きな問題となってしまいます。
そのため、このプログラムでも例外処理を行うことにします。ただし、今回行っていることはメッセージを出して終了するという処理のみなので、全く難しいところはありません。


begin
(例外の発生を監視する処理)
rescue
(例外発生時の処理)
end
これがRubyの例外処理の基本文法です。Javaなどに慣れていれば、try〜catchがそのままbegin〜rescueになるという理解でよいと思います。具体的には、以下のようになります。

begin
File.open(file_path) do |f|
f.each do |line|
temp_lines << line
end
end
rescue
puts "ファイルの読み込みに失敗しました。"
exit
end
今回は、捕捉する例外の型指定や、例外オブジェクトの操作などは行っていません。


また、引数の受け取り方を変更し、ヘルプ機能を付けました。

#sort.rb

unless ARGV[0]
puts "ファイルまたはオプションを指定してください。"
puts "help is option: -h"
exit
end

case ARGV[0]
when /^-h/
puts "Works: Sort the Lines in File. Sort type is Dictionary."
puts "Usage: ruby sort.rb [file_path] [options]"
puts " Enable file types:"
puts " .txt .csv"
puts " Options:"
puts " -r reverse"
puts " -n not sort"
puts " -w[\"string\"] word search by \"regex\""
exit
when /^-v/
puts "sort 0.1.1"
exit
end

file_path = ARGV[0]

sort_flag = true
reverse_flag = false
search_str = String.new
ARGV.delete_at(0)
ARGV.each do |argv|
case argv
when /^-r/
reverse_flag = true
when /^-n/
sort_flag = false
when /^-w\[(.*)\]/
search_str = $1
end
end

if /\.(txt|csv)$/i !~ file_path
puts "扱えないファイルです。"
exit
end

temp_lines = []
begin
File.open(file_path) do |f|
f.each do |line|
temp_lines << line
end
end
rescue
puts "ファイルの読み込みに失敗しました。"
exit
end

temp_lines.sort! if sort_flag
temp_lines.reverse! if reverse_flag

begin
File.open("result_" + file_path, "w") do |f|
temp_lines.each do |line|
if /#{search_str}/ =~ line
f.puts line
end
end
end
rescue
puts "ファイルの書き込みに失敗しました。"
exit
end

解説は時間があるときに付けます。

とりあえず、この連載?は今回で終了とします。ひとつの話題を分けて書くと、日数を稼げてブログ的に楽だということがわかったので、次回もシリーズ物にします。次の話題は、最近興味のある分野(GUIアプリ、Webアプリ、UNIX)のどれかになると思います。