2016-08-29 2 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; 
} 

이 코드를 어떻게 해석해야합니까? 동료 개발자는이 유형의 사용법을 본 적이 없지만 "항상 메소드를 종료하기 직전에 항상 마침"이라고 말합니다. 그러면 catch를 다시 시작한 후에 마지막으로 e를 던지기 전에 catch/return이 false를 반환합니다. 마침내. 이 올바른지?

+2

예, 'finally'는 (return 또는'throw '를 통해) 메소드를 종료하기 직전에 항상 실행됩니다. – Blorgbeard

+1

다음은 예외 처리 문서로 연결되는 링크입니다. https://msdn.microsoft.com/en-us/library/ms173162.aspx – astidham2003

+6

그런 식으로 다시 재사용하면 스택 추적이 깨질 수 있으므로주의해야합니다. 'throw; 스택 추적을 유지합니다. – Phaeze

답변

0

음, finally C에서 #은 예외가 발생 될 때 자동으로 호출되는 C++에서 스택 기반 객체의 소멸자와 비슷한 방식이다.

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

은, 하나는이 같은 코드를 작성합니다 : 또는

,

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 
} 

을,이보다 일반적인 만들 수 있습니다 람다와 함께 ...