CでのJavaの例外:IllegalArgumentExceptionの等価++
-
22-08-2019 - |
質問
Javaでは、我々は(タイプIllegalArgumentException
である)RuntimeException
を投げることができます。 C ++では、チェックされ、チェックされない例外という概念はありません。実行時例外を示すために使用することができ、標準C ++で同様の例外はありますか?またはそこには、標準では一般的なスタイルではなく、誰もがこのような状況のため、実際には次の?
それとも、私はちょうど私の独自のカスタム例外を作成し、それをスローする必要がありますか?
解決
は、Javaと異なり、C ++は「標準フレームワーク」が、わずかな(とオプション)標準ライブラリを持っていません。また、例外がすべてでを使用するかどうかをC ++プログラマの下に異なる意見がありますの
そのため、あなたは異なる人々によって異なる勧告を見つける:いくつかは、いくつかのライブラリ(例えばポコ)が(STD由来::例外)カスタム例外階層を使用し、標準ライブラリからの例外タイプを使用するように、他のものは使用しないでくださいすべての例外(例えばQtの)ます。
あなたが標準ライブラリに固執したい場合は、は、専門的な例外タイプが存在する:。invalid_argument
(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
他のヒント
のstd :: domain_errorは、あなたが探しているものかもしれませんが、私は非常に少数の人々はそれを使用する疑いがあります。ほとんどの人ははstd ::例外から、独自の例外型を派生ます。
私は常に不正な引数のためstd::invalid_argument
を使用します。
あなたは意味無効に満足していないメソッド期待値を行うことにより、あなたが投げることができる場合は、
std::logic_error
or
std::runtime_error.
あなたは一つのオブジェクトのようなキャストに関連する何かを意味場合は別のものに変換することはできません - そこにそのための例外はありませんし、それが自動的にスローされることはありません。
それは意志実際にはの。をしかし、唯一のためのdynamic_cast <>参照に。 それがスローされます。
std::bad_cast
私はあなた自身のことで、この1を投げるのは良いアイデアであることを確認していません。
私はそれが論理エラーであるため、logic_errorと、誰かが間違ったパラメータが渡された場合にはその誘導体を使用することを好む:引数のプログラマ渡さ間違ったタイプ。
しかし、私はそのような場合にアサートを使用したいすべてのより。あなたの関数に間違った値やタイプを渡すようなものが唯一の開発と、そのようなチェックで許容することができますのでリリースでは避けるべきです。
あなたは、標準の例外をスローしたり、独自のロールバックすることができます。あなたが投げている例外に追加情報を含めることができ、そしてそれはあなた自身を行うには十分な理由になります。
個人的に、私は私が働いてきたシステムのチェックインなどのドメインを見ていません。それは確かに普遍的ではありません。