From: nobu.nakada@... Date: 2003-05-20T16:24:01+09:00 Subject: [ruby-dev:20241] Re: Exception#initialize なかだです。 At Tue, 20 May 2003 10:09:09 +0900, Yukihiro Matsumoto wrote: > |Exceptionのサブクラスで、いくつかRubyレベルで触れないインスタン > |ス変数があるので、initializeを通して初期化するようにしてみまし > |た。 > | > |すべての引数は省略可能です。 > | > |NameError#initialize(msg, name) > |NoMethodError#initialize(msg, name, args) > |SystemCallError#initialize(msg, err) > > あ、わたし、この修正について誤解してました。 > これで構いません。取り込んでくださいませんか? リファレンスマニュアル(SystemCallError)に追加してて思ったんです が、エラーを発生させようとすると、これでもやはりちょっと面倒で す。 # http://www.ruby-lang.org/ja/man-1.6/index.cgi?cmd=view;name=SystemCallError begin raise Errno::ENOENT rescue Errno::ENOENT p Errno::ENOENT::Errno # => 2 p $!.errno # => nil end # 現状 raise SystemCallError.new("nonexistent file", Errno::ENOENT::Errno) Errno::EXXX#initializeでerrnoのデフォルト値として各Errnoを使う ようにしてはどうかと思うんですが、やりすぎでしょうか。 raise Errno::ENOENT.new("nonexistent file") # または raise Errno::ENOENT, "nonexistent file" Index: error.c =================================================================== RCS file: /cvs/ruby/src/ruby/error.c,v retrieving revision 1.66 diff -u -2 -p -r1.66 error.c --- error.c 20 May 2003 01:51:32 -0000 1.66 +++ error.c 20 May 2003 03:13:10 -0000 @@ -543,8 +543,14 @@ syserr_initialize(argc, argv, self) char *buf; VALUE error, mesg; + VALUE klass = rb_obj_class(self); - if (rb_scan_args(argc, argv, "11", &mesg, &error) == 1 && FIXNUM_P(mesg)) { + rb_scan_args(argc, argv, klass == rb_eSystemCallError ? "11" : "02", + &mesg, &error); + if (argc == 1 && FIXNUM_P(mesg)) { error = mesg; mesg = Qnil; + } + if (klass != rb_eSystemCallError && NIL_P(error)) { + error = rb_const_get_at(klass, rb_intern("Errno")); } err = strerror(NUM2LONG(error)); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦