Custom exceptions should never inherit from Throwable directly