メソッドを呼び出したあとにNoMethodErrorを返してあたかも自分が定義されていないかのように振る舞えるメソッドを作りました
class Object def raise_n_m_error er ee = caller[0][/`([^']*)'/, 1] ex = NoMethodError.new begin self.__send__(?#) rescue $!.message.sub(?#, ee) end ex.set_backtrace(er) raise ex end end def test raise_n_m_error caller end test #=> test.rb:18:in `<main>': undefined method `test' for main:Object (NoMethodError)
これをメソッド内で呼び出すと、絶対に呼ばれないであろうメソッド#
が呼ばれます。
で、その後そのメソッド名の置換をし、caller
でバックトレースして返します。
これでエラー内容を偽装し、エラー発生位置を偽装することができます
もちろん、define_method
で#
が定義されると呼ばれてしまってなんか変なことになるのでそこら辺はまあ
以上っ!