2016-08-29 20 views
0

私は理解していないC#を使っているC++開発者です。コードの形式は基本的には奇妙なフロー制御コード

bool method (params) 
{ 
    ... 
    try 
    { 
     Do Some Stuff with some manual throws and some method calls; 
    } 
    catch (Exception e) 
    { 
    if (e is SomeSpecificTypeOfException) 
      throw e; 
    else 
      return false; 
    } 
    finally 
    { 
     Do Some More Stuff; 
    } 
    ... 
    return true; 
} 

このコードをどのように解釈すればよいですか?仲間の開発者は、このタイプの使用法は見たことがないと言いますが、おそらく "最後には常にメソッドを終了する前に行う"と言います。つまり、キャッチしてからrethrowが最後にeをスローする前にキャッチ/リターンを返します。最後に。これは正しいです?

+2

はい、 'finally'はメソッドを終了する直前に(' return'または 'throw'を介して)実行されます。 – Blorgbeard

+1

ここに例外処理のドキュメントへのリンクがあります:https://msdn.microsoft.com/en-us/library/ms173162.aspx – astidham2003

+6

重要なことに注意することは、そのような再スローさせるとスタックトレースが壊れることになります。 'throw;'はスタックトレースを保持します。 – Phaeze

答えて

0

まあ、finallyは、例外がスローされたときに自動的に呼び出され、C++でのスタックベースのオブジェクトのデストラクタに似たいくつかの方法です。

try { a; } 
catch { b; } // Might have multiple catches... 
finally { c; } 

はと本質的に同等である代わりに、:

class Cleaner { ~Cleaner() { c(); } }; 

void method() 
{ 
    Cleaner cleaner; 
    try { a(); } 
    catch(...) { b(); } 

    // Thus c(); would be executed before leaving method 
} 

明らかに、これはより一般的な行うことができます:C++で

try 
{ 
    try { a; } 
    catch { b; } // All catch clauses would be here... 
} 
catch 
{ 
    c;  // code that was in finally block. 
    throw; // rethrow same exception 
} 

、1はこのようなコードを記述しますラムダで...