At 21:07 08/06/24, Akinori MUSHA wrote: >At Tue, 24 Jun 2008 01:38:47 +0900, >matz wrote: >> In message "Re: [ruby-dev:35210] Re: IncompatibleEncodingError" >> on Tue, 24 Jun 2008 01:31:50 +0900, "NARUSE, Yui" <naruse / airemix.jp> >writes: >> >> |Encoding::IncompatibleError < StandardError > ほかに Encoding 関係のエラーを追加するときも StandardError の >直下にぶらさげるんでしょうか。 > > IncompatibleEncodingError ってのは Encoding 関係で複数の例外を >区別する必要が生じてからでよいので、とりあえず > >class EncodingError < StandardError; end > >だけ導入するのはどうでしょうか。 Encoding と transcode を一緒にした方がいいと考えると、 現在一般的な例外になっている transcode.c 内の一部のところも Encoding:: 下に入れることが考えられる。 現在の transcode.c 内の rb_raise を分析しますと次の通りになります: rb_raise(rb_eArgError, "transcoder from %s to %s has been already registered", 内部エラーみたいなもので、種類はそれほど気にしなくていい。 rb_raise(rb_eArgError, "invalid library name - %s", 内部エラーみたいなもので、種類はそれほど気にしなくていい。 rb_raise(rb_eRuntimeError /*@@@change exception*/, "conversion undefined for byte sequence (maybe invalid byte sequence)"); 変換が未定義で、ここは Encoding::UndefinedCharacterError とか出はどうでしょうか。 典型例は UTF-8 から例えば EUC-JP への変換で、EUC-JP で表現できない文字の場合。 rb_raise(rb_eArgError, "unknown value for invalid: setting"); 元のデータに問題があるということで、これは他のところで同じエラーが出ると 一緒にしたいと思います。典型例は UTF-8 で UTF-8 出ないバイト列など。 rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..2)", argc); これは encode メゾドに投げた引数の数が違うということで、多分 ArgError でいいだろう。 rb_raise(rb_eArgError, "transcoding not supported (from %s to %s)", from_e, to_e); これは割りと rescue するのが多いのではないかと思います (例えば何か特殊な encoding へ変換してみて、これがだめでしたら同じ系列のもっとベージックなものをやってみるとか) なので、もしかして区別してもいいのかな。 rb_raise(rb_eArgError, "not fully converted, %td bytes left", sp+slen-fromp); これは文字が途中で切られている場合など起こりますので、Encoding:: 下でいいと思います。 アドバイスを宜しくお願いします。 Martin. #-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University #-#-# http://www.sw.it.aoyama.ac.jp mailto:duerst / it.aoyama.ac.jp