2018/03/20(火) [n年前の日記]
#1 [ruby][mruby] Cプログラムに組み込んだmruby側のエラー処理
Cで書いたプログラムに組み込んだ mruby 側で、エラーが出ていることを判別したり、どんなエラー内容なのかを取得したり、ということをしたいわけで。
ググったら、やっぱりちゃんと機能として用意されてた。
_Cでmrubyコード実行時に発生したエラーの内容とバックトレースを取得 - Qiita
_Cに組み込んだmrubyのコードのエラーハンドリングについて - Kentaro Kuribayashi's blog
手元のソースでは、以下のような感じにしてみた。mruby 側でエラーが出た時だけ、エラー内容を printf() で出力して、return -2 で戻る処理。
mrb_load_file(mrb_state *mrb, FILE *fp) で、mrubyスクリプトファイルを読み込んで実行することができるけど、その時の戻り値を取っておいて…。
ちなみに、mruby関係の記事を色々眺めていて、なんだか分かってきたけど、mruby の場合、〜_p とついてる関数だかマクロだかは、「〜な状態か?」を 真/偽 (1/0、TRUE/FALSE) で返すことになっているらしい。
ググったら、やっぱりちゃんと機能として用意されてた。
_Cでmrubyコード実行時に発生したエラーの内容とバックトレースを取得 - Qiita
_Cに組み込んだmrubyのコードのエラーハンドリングについて - Kentaro Kuribayashi's blog
手元のソースでは、以下のような感じにしてみた。mruby 側でエラーが出た時だけ、エラー内容を printf() で出力して、return -2 で戻る処理。
// display mruby state error
void mrb_state_error_disp(mrb_state *mrb)
{
// error
mrb_value exc = mrb_obj_value(mrb->exc);
// error information
mrb_value backtrace = mrb_get_backtrace(mrb, exc);
mrb_value inspect_bt = mrb_inspect(mrb, backtrace);
printf("%s\n", mrb_str_to_cstr(mrb, inspect_bt));
// backtrace
enum mrb_vtype type = mrb_type(exc);
mrb_value inspect = mrb_inspect(mrb, exc);
printf("%d : %s\n", type, mrb_str_to_cstr(mrb, inspect));
}
...
mrb_state *mrb = mrb_open();
fp = fopen("main.rb", "r");
mrb_obj = mrb_load_file(mrb, fp);
fclose(fp);
if (mrb->exc != 0 && (mrb_nil_p(mrb_obj) || mrb_undef_p(mrb_obj)))
{
// error
mrb_state_error_disp(mrb);
mrb->exc = 0;
mrb_close(mrb);
return -2;
}
mrb_load_file(mrb_state *mrb, FILE *fp) で、mrubyスクリプトファイルを読み込んで実行することができるけど、その時の戻り値を取っておいて…。
mrubyのコードを評価した結果が上記のようなエラーとなった場合、以下の値が帰ってきます。ということらしいから、以下でエラーが出たかどうかを判別できる。
* コンパイル時のエラー: nil(mrb_nil_value()の返す値)
* 実行時のエラー: undef(mrb_undef_value()の返す値)
また、mrb->excにエラーの内容が代入されます。Cに組み込んだmrubyのコードのエラーハンドリングについて - Kentaro Kuribayashi's blog より
if (mrb->exc != 0 && (mrb_nil_p(mrb_obj) || mrb_undef_p(mrb_obj)))
{
// error
}
ちなみに、mruby関係の記事を色々眺めていて、なんだか分かってきたけど、mruby の場合、〜_p とついてる関数だかマクロだかは、「〜な状態か?」を 真/偽 (1/0、TRUE/FALSE) で返すことになっているらしい。
- mrb_nil_p(hoge) は「hoge は nil か?」を真偽で返す。
- mrb_undef_p(hoge) は「hoge は undef か?」を真偽で返す。
[ ツッコむ ]
#2 [ruby][mruby] mrubyのタグをつけた
ここ最近 mruby 関係を弄ってたけど、日記にメモする際に「ruby」のタグをつけてたわけで。しかし、なんだかちょっとメモの量が多くなってきたような気がするので、ここに来て「mruby」のタグを各メモに対してつけ直しておいた。とメモ。
しかし、数ヶ月後には、このタグをつけてたことを忘れそう。どんなタグを用意したのか、すぐ忘れちゃうんだよな…。
しかし、数ヶ月後には、このタグをつけてたことを忘れそう。どんなタグを用意したのか、すぐ忘れちゃうんだよな…。
[ ツッコむ ]
以上、1 日分です。