理論的には、複雑な例外をいつでも投げることができますが、ほとんどの場合、必要ないかもしれません。
私の質問は、このメソッドは問題ありませんか?
はい、いいえ理論的には、それは練習ではありませんが、それは良いことではありません(下記参照)。しかしまだやっているのであれば、少なくとも私は#define
に読みやすくするためのエラーコードを提案しています。
#define UNEXPECTED_END_OF_STREAM -2
if(strm->atEnd()){
// unexpected end of stream
throw UNEXPECTED_END_OF_STREAM;
}
エラーコード/例外として-ve数値を投げることは非常に珍しいことであり、おそらく嫌になるでしょう。実際に人々はあなたが何をしたいのか(ほとんどの場合は少なくとも)、つまりエラーを捕まえることを正確に行うにもかかわらず、int
の例外を投げ捨ててしまいます。
私がスローする最も一般的な例外は、単純な文字列例外をスローするために変わったstd :: runtime_error( "My error") `です。ほとんどの場合、基本的な例外はすべて私たちが必要とするもので、エラーを検出して返します。
実際に例外処理の中心であるtry-catch
ブロックの利点をいつでも得ることができます。 int
例外をスローする場合も同様です。私はint
がエラーコードを示す可能性が高いと思います。ときどきこれは、dllの内部で例外を使用しているが、代わりにエラーコードを外部に返す必要があると言う必要があります。私はあなたの質問が本当にこの問題に沸騰すると思う、私はint
例外を投げることができますし、私はする必要がありますか?
でも、あなたはそれを行うことができますが、int
例外を投げることは最もエレガントなことではありません。どうして? int
はプリミティブなデータ時間であり、オブジェクト指向をC++で考えると思うので、オブジェクトをスローする方がよいでしょう。これは、エラーコードint
をオブジェクトにカプセル化し、そのオブジェクトをスローする必要があるかもしれないことを意味するかもしれません。おそらく、あなたがそれをやっているときには、エラーを説明する文字列を追加するのも良い考えです。ここに私が過去にしたことがあります。例外クラスをstd::runtime_error
から派生させ、エラーコードを追加しました。あなたは例外/エラーコードをスローするようにしたいとき
class my_error : public std::runtime_error
{
public:
my_error(std::string const& msg, int code);
virtual ~my_error(void);
// the error code which you want to throw
int errCode;
};
は今、あなたが実行します。
throw my_error("this is my own error!", UNEXPECTED_END_OF_STREAM);
出典
2014-05-22 18:41:51
zar
私は一緒のものをハッキングしていたときにそれを行うことがあります。しかし、私が終わったら、それは常に(std :: rtuntime_errorから派生した)実際の例外オブジェクトを生成します。これにより、すべての例外処理コードが単純化されます。 main()でそれを捕まえてください。どのコンポーネントがエラー-345678を生成したかをどのように知っていますか? –