如何在mruby中默认引发错误/异常?

And*_*rew 3 mruby

我开始使用mruby,并发现很难在我的代码中发生错误,但是没有错误报告。也许我做错了。发生错误时如何显示错误?

C代码摘录:

mrb = mrb_open();
FILE *f = fopen("example.rb", "r");
mrb_load_file(mrb, f);
fclose(f);
// more C code...
Run Code Online (Sandbox Code Playgroud)

Ruby代码失败,没有报告:

# example.rb
def my_method
  call_undefined_method
end
my_method()
Run Code Online (Sandbox Code Playgroud)

从错误中解救出来以显示存在错误的Ruby代码:

# example.rb
def my_method
  call_undefined_method
rescue => e
  puts "Error: #{e.message}"
end
my_method()
Run Code Online (Sandbox Code Playgroud)

mat*_*ttn 5

您可以通过获取异常 mrb->exc

#include <mruby.h>
#include <mruby/variable.h>
#include <mruby/string.h>
#include <stdio.h>

int
main(int argc, char* argv[]) {
  mrb_state* mrb = mrb_open();
  FILE *f = fopen("example.rb", "r");
  mrb_value obj = mrb_load_file(mrb, f);
  fclose(f);

  if (mrb->exc) {
    // Error
    obj = mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0);
    fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout);
    putc('\n', stdout);
  } else {
    obj = mrb_funcall(mrb, obj, "inspect", 0);
    fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout);
    putc('\n', stdout);
  }

  mrb_close(mrb);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)