2017-09-26 9 views
2

はのは、いくつかの人工的なC++のコードを考えてみましょうtry`支店:C++成功 `

int i = 0; 

try { someAction(); } 
catch(SomeException &e) { i = -1; } 

i = 1; 

... // code that uses i 

が、私はこのコードがsomeAction()の場合にi-1を割り当てる例外をスローし、例外がなかった場合場合に1を割り当てます。今度はiがいつもいつも1になるので、このコードは間違っています。何のいずれかが、tryブロックでスローがあった場合、私は場合にはいくつかのアクションもしない「成功したトライのブランチ」、のようなものがCであり++:

int i = 0; 
bool throwed = false; 

try { someAction(); } 
catch(SomeException &e) { throwed = true; } 

i = throwed ? -1 : 1; 

... // code that uses i 

私の質問は:確かに、私たちはのようないくつかのトリックの回避策を行うことができますか?以下のような 何か:確かに

int i = 0; 

try { someAction(); } 
catch(SomeException &e) { i = -1; } 
nocatch { i = 1; } 

... // code that uses i 

は、Cにはnocatchありません++多分いくつかの一般的な美しい回避策はありますか?

+0

「ノッチ」は「試行」と呼ばれます。 – molbdnilo

+0

tryブロックまたはcatchブロック内に複数行のコードを記述することができます。 – AndyG

+4

「i」を「1」に初期化する方法もあります。それは最も簡単です。別の方法は、コードを関数(例えばラムダ)に入れて、 'i'値を返すことです。 –

答えて

11
int i = 0; 

try { someAction(); i = 1; } 
catch(SomeException &e) { i = -1; } 
+8

'i'を' 1'に初期化するだけです。割り当ての脆弱な配置の必要はありません。編集:私は非常に短いですが、不必要に壊れやすいコードを提唱する答えのupvotesを理解していない。 –

+0

@ Cheersandhth.-Alf:「i」を「1」に初期化する方が簡単ですが、なぜこのコードが壊れやすいのか理解できますか? – AndyG

+2

@AndyG: 'try'ブロックの最後にある' i'への代入に依存します。メンテナンスによってそれが変わるかもしれない。 –

0

ほかに簡単な解決策

try 
{ 
    someAction(); 
    i = 1; 
} 
catch(SomeException &e) 
{ 
    i = -1; 
} 

から、あなたはコード内でさらにiの値で行うことを計画しているかを検討すべきである - if文でそれを使用しますか?これは設計が貧弱なため、trycatchの後にすべてのコードを中括弧の中に入れることができます。