use StandardError not Exception

Exception is the superclass of all errors and Interrupts. You don't
want to mess with that.

If you just call
  raise 'error message'
it will create a RuntimeError and that will be caught by
  rescue exc
as that catches StandardError.

You don't want to call raise Exception.new or inherit from Exception
because that would not get caught by rescue like that.

You don't want to rescue Exception => exc - because that would also
rescue from Interrupts like CTRL+c.