2017-11-27 7 views
-2

私は例外をスローするかもしれないコンストラクタを持っています。これが発生すると、デコンストラクタが呼び出されることは私の理解です。問題は、オブジェクトが実際に正常に構築されたかどうかをチェックする手がかりがないことです。C++失敗したオブジェクトの構築で実行を中断する方法は?

私は

if (objectName) { 
    //keep working 
} else { 
    //alert that something went wrong 
} 

をやってみましたしかし、私はあなたがJavaでできるようにポインタが常に存在しますが、そうでない何かを指している可能性があるとして、あなたがC++に「ヌル」オブジェクトを持つことができないということを学びました欲しいです。

私はまた、オブジェクトのインスタンス化についてもう一度キャッチしようとしましたが、実行は通常どおり続行されます。オブジェクトが正常に構築され、使用できる状態になっているかどうかを確認するベストプラクティスは何ですか?

+3

例外がスローされない場合、オブジェクトは完全に構築されます。 –

+3

コンストラクタがスローすると、例外を常にキャッチできます。あなたが何をしているのかを示す実際のコードを投稿してください。 –

+0

ベストプラクティスは、絶対にしなければ投げてはいけません。また、これを読んでください:http://www.stroustrup.com/bs_faq2.html#ctor-exceptions –

答えて

3
try { 
    Type obj; 
    //keep working 
} 
catch (/* ... */) { 
    //alert that something went wrong 
} 

objtryブロック内でのみ可視です。コンストラクタがスローすると、tryブロックが残っているので、objは存在しません。ここには「nullインスタンス」という概念はありません。 objのいずれかが存在し、有効であるか、または例外が例外としてtryブロックを終了したために存在しません。

+0

応答のためにありがとう、実際には私の質問の2番目の部分では、私が非常に不十分に記述したので、私がやったこと。問題は、try内のコードが、エラーを投げているオブジェクトに関係なく実行し続けていることです。何が原因なのでしょうか? – Daniel

+1

@ダニエルそれはできません。コンストラクタがスローすると、プログラムは直接 'catch'ステートメントにジャンプします。ここで合理的な説明は、あなたが何が起こっているのかを誤解しているということだけです。例外をスローしているコンストラクタ(この場合は 'Type :: Type()')は本当に確実でしょうか? –

+0

こんにちは、私は実際にそれを考え出し、私の答えを以下で確認してください。私は誰かが答えるのが大好きで、最後に質問があります。 – Daniel

関連する問題