Ruby の Exception class を設計し直すとしたら
これの続き。
MRI での Exception の問題点は、「メッセージ」=「表示文字列」となっていることだ。本来ならば、メッセージを get/set するメソッドとは別に、表示文字列を構築するメソッドを用意すべきだった。
class Exception
def initialize(message)
@message = message
end
attr_accessor :message
def to_str
return @message
end
end
class SyntaxError < Exception
def initialize(message, filename=nil, linenum=nil)
super(message)
@filename = filename
@linenum = linenum
end
attr_accessor :filename, :linenum
def to_str
message = super()
return "#{@filename}:#{@linenum}: #{message}"
end
end
ただ、現在の仕様を変更すると影響が大きいだろうから、
- Exception#message は表示文字列を構築するメソッドということにして、
- メッセージを取り出す Exception#msg を新たに追加する
という仕様に変更するのはどうだろうか。
class Exception
def initialize(msg)
@msg = msg
end
attr_accessor :msg
def message
return @msg
end
end
class SyntaxError < Exception
def initialize(msg, filename=nil, linenum=nil)
super(msg)
@filename = filename
@linenum = linenum
end
attr_accessor :filename, :linenum
def message
return "#{self.filename}:#{self.linenum}: #{self.msg}"
end
end