【问题标题】:How to raise errors/exceptions by default in mruby?如何在 mruby 中默认引发错误/异常?
【发布时间】:2013-11-25 05:06:05
【问题描述】:

我开始使用 mruby,发现我的代码中发生了错误,但没有错误报告。也许我做错了什么。如何让错误在发生时出现?

C 代码节选:

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

Ruby 代码失败但未报告:

# example.rb
def my_method
  call_undefined_method
end
my_method()

从错误中拯救以显示存在错误的 Ruby 代码:

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

【问题讨论】:

    标签: mruby


    【解决方案1】:

    您可以通过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;
    }
    

    【讨论】:

    • 有什么方法可以得到回溯吗? (必须调用 Ruby backtrace 方法,或者是否有 C API 函数用于此?)
    • 刚刚意识到有mrb_print_error(mrb); - 这似乎是一种更简单的打印错误的方法。还找到了mrb_print_backtrace(mrb);,但它什么也没产生? mrb_get_backtrace 产生一个空数组。这是没有实现的东西吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2013-11-25
    相关资源
    最近更新 更多