From: "NARUSE, Yui" Date: 2008-06-25T16:12:51+09:00 Subject: [ruby-dev:35225] Re: IncompatibleEncodingError 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" > >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 for byte sequence in " というように、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 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が不完全だからなのですが、 現象としては不完全な「変換」ですので、区別してもいい気がします。 迷うところですね。