2009-03-25 21 views
21

メソッドの入力引数が無効な場合、JavaではIllegalArgumentException(型はRuntimeException)をスローすることができます。 C++では、チェックされた例外と未チェックの例外はありません。ランタイム例外を示すために使用できる標準C++にも同様の例外がありますか?あるいは、標準にない共通のスタイルがありますが、誰もがこのような状況のために実際に従いますか?C++でJavaのIllegalArgumentExceptionに相当する

または、自分のカスタム例外を作成してスローする必要がありますか?

答えて

39

Javaとは異なり、C++には「標準フレームワーク」はなく、小型(オプション)標準ライブラリのみがあります。さらに、C++プログラマーの間では、例外をすべて使用するかどうかについて異なる意見があります。です。

標準ライブラリの例外タイプを使いたい人もいれば、いくつかのライブラリ(例えばPoco)はカスタム例外階層(std :: exceptionから派生したもの)を使用しているものもあれば、そうでないものもあります。例外(例えばQt)をまったく使用しないでください。

標準ライブラリに固執する場合は、特殊な例外タイプがあります。invalid_argument(extend logic_error)です。参考のため

#include <stdexcept> 

// ... 
throw std::invalid_argument("..."); 

:ここstdexceptで定義されている(と文書化)標準の例外タイプの概要です:

exception 
    logic_error 
     domain_error 
     invalid_argument 
     length_error 
     out_of_range 
    runtime_error 
     range_error 
     overflow_error 
     underflow_error 
2

std :: domain_errorがあなたが探しているものかもしれませんが、ごく少数の人が使用していると思われます。ほとんどの人は、std :: exceptionから独自の例外タイプを派生します。

1

、あなたが一つのオブジェクトのようなキャストに関連する何かを意味場合は別のものに変換することはできません

std::logic_error 
or 
std::runtime_error. 

を投げることができ満足方法期待値ではないとはどういう意味無効による場合 - そのためにも例外はありませんが、自動的に投げられることはありません。

実際はそうです。ただし、dynamic_cast <のみ>を参照してください。 それは私があなた自身のことで、この1を投げるのは良いアイデアであることを確認していない

std::bad_cast 

がスローされます。

ロジックエラーであるために間違ったパラメータを渡した場合、logic_errorとその派生語を使用することをお勧めします。プログラマが間違った型の引数を渡しました。

しかし、私はそのような場合にassertを使用するのが好きです。間違った値や型を関数に渡すようなことは、開発中にのみ受け入れられ、そのようなチェックはリリースで避けるべきです。

+0

参照型のdynamic_cast <>()は標準例外をスローしますか? –

+0

これは、std :: bad_cast例外です。それが参考になっている場合。ポインタを使用すると、0が返され、ユーザコードは結果値をチェックする必要があります。 –

+0

うん、std :: bad_cast。 –

2

私は常に無効な引数としてstd::invalid_argumentを使用します。

1

あなたは、標準の例外をスローしたり、独自のロールバックすることができます。スローしている例外に追加情報を含めることができます。これは自分自身で行うのがよい理由です。

個人的には、私が取り組んだシステムでこのようなドメインチェックは見たことがありません。それは確かに普遍的ではありません。

関連する問題