fn raise(vm: &mut VM, _: Value, args: &Args2) -> VMResult {
    args.check_args_range(0, 2)?;
    match args.len() {
        0 => Err(RubyError::none("")),
        1 => {
            let arg0 = vm[0];
            if let Some(s) = arg0.as_string() {
                Err(RubyError::none(s))
            } else if arg0.is_class() {
                if arg0.is_exception_class() {
                    let method = arg0.get_method_or_nomethod(&mut vm.globals, IdentId::NEW)?;
                    vm.globals.val = vm.eval_method0(method, arg0)?;
                    Err(RubyError::value())
                } else {
                    Err(RubyError::typeerr("Exception class/object expected."))
                }
            } else if arg0.if_exception().is_some() {
                vm.globals.val = arg0;
                Err(RubyError::value())
            } else {
                Err(RubyError::typeerr("Exception class/object expected."))
            }
        }
        _ => Err(RubyError::none(vm[1].clone().expect_string("2nd arg")?)),
    }
}
raise -> ()
fail -> ()
raise(message, cause: $!) -> ()
fail(message, cause: $!) -> ()
raise(error_type, message = nil, backtrace = caller(0), cause: $!) -> ()
fail(error_type, message = nil, backtrace = caller(0), cause: $!) -> ()
ruruby/src/builtin/kernel.rs