At Wed, 25 Jun 2008 10:48:06 +0900,
成瀬です。

Martin Duerst wrote:
> 
> 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クラスが作られることがないならば、一緒の方がいいかもしれません。
作られることがもしあると、悩ましいですねぇ。

> 現在の 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_bug とかの方がいいのかも。

>         rb_raise(rb_eRuntimeError /*@@@change exception*/, "conversion undefined for byte sequence (maybe invalid byte sequence)");
> 変換が未定義で、ここは Encoding::UndefinedCharacterError とか出はどうでしょうか。
> 典型例は UTF-8 から例えば EUC-JP への変換で、EUC-JP で表現できない文字の場合。

UndefinedCharacterError でしょうね
エラーメッセージは
 "conversion undefined in <to> for byte sequence in <from>"
というように、from encoding と to encoding が分かった方がいいかもしれません。

>         rb_raise(rb_eArgError, "unknown value for invalid: setting");
> 元のデータに問題があるということで、これは他のところで同じエラーが出ると
> 一緒にしたいと思います。典型例は UTF-8 で UTF-8 出ないバイト列など。

このエラーって、String#encode(enc, invalid: value) の value が不正な場合の
エラーじゃないですかね。

さておき、下のデータに問題がる場合は
re.c 1179 行目の "broken <encoding> string" や、
parse.y の "invalid ..." が同じ種類ですね。

>         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
> へ変換してみて、これがだめでしたら同じ系列のもっとベージックなものをやってみるとか)
> なので、もしかして区別してもいいのかな。

ですね、別にしてもいいかもしれません。
UnsupportedConversion ?

>         rb_raise(rb_eArgError, "not fully converted, %td bytes left", sp+slen-fromp);
> これは文字が途中で切られている場合など起こりますので、Encoding:: 下でいいと思います。

うーん、どうでしょう。
エラーのそもそもの原因は確かに引数であるStringが不完全だからなのですが、
現象としては不完全な「変換」ですので、区別してもいい気がします。
迷うところですね。