0
Help us understand the problem. What are the problem?

posted at

updated at

Organization

RubyのC拡張で例外クラスを定義する方法

はじめに

Ruby言語では、StandardErrorを継承して例外を定義する。

class NoIndexError < StandardError; end

RubyのC拡張ライブラリ(Ruby C extension)で例外クラスを定義したい。

やり方

例外クラスを定義する

C拡張を書く時もRuby言語とまったく同じように、StandardErrorを継承したクラスを定義すればよい。
以下のようにして例外を定義できた。

VALUE rb_Bio;
VALUE rb_CGRanges;
VALUE rb_eNoIndexError;

void Init_cgranges(void)
{
  rb_Bio = rb_define_module("Bio");
  rb_CGRanges = rb_define_class_under(rb_Bio, "CGRanges", rb_cObject);
  rb_eIndexedError = rb_define_class_under(rb_CGRanges, "IndexedError", rb_eStandardError);
// 以下略

例外を呼び出す

rb_raise を使えばよい。
ここでは、インスタンス変数 @indexed をチェックして、true だった場合には例外を発生させる。
RTEST は、true/false を判定してくれる。

  if (RTEST(rb_ivar_get(self, rb_intern("@indexed"))))
  {
    rb_raise(rb_eIndexedError, "Cannot add intervals to an indexed CGRanges");
    return Qnil;
  }

動作を確認する

test/unit を使っているので、下記のようにテストを作成した。
期待通り例外を発生させることができた。

    cgranges.index
    assert_raises(Bio::CGRanges::IndexedError) do
      cgranges.add("chr1", 10, 20, 0)
    end

この記事は以上です。

よい一日を。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?