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