Pulled this out of a talk by Avdi. This technique is described at 16:00 in the video.
It’s nice for the user of a library to be able to catch any error coming out of the library, but at the same time, it’s nice for a library to pass through basic error types like HTTPError. To solve the problem, you can “tag” the HTTPError with your own error class, essentially raising both types of error:
module MyLib::Error; end
def make_a_network_call
...
rescue HTTPError => e
e.extend(MyLib::Error)
raise
end
Update: more in-depth explanation of this technique is available in his book Exceptional Ruby