2010-12-08 3 views
6

나는 마침내 블록을 잡으려고했는데 어떤 예외가 생기면 catch 블록에서 돌아올거야. 그래서 마침내 블록이 여전히 실행된다. 그렇다면 언제? 반품 전 또는 반품 후에?함수에서 catch 블록을 통해 돌아 오면 finally 블록은 어떻게됩니까?

올바른 방법입니까?

try 
{ 
// do something 
} 

catch (Exception) 
{  
    return false; 
} 
finally 
{ 
    if (connection.State == ConnectionState.Open) connection.Close(); 
} 
+3

catch에서 두 줄과 마지막으로 중단 점을 설정했는지 알 수 있습니다. – RvdK

+0

까다로운 사람 ...... 나는 알고있다! - 당신은 그것을 실행할 수 있고 무슨 일이 일어나는 지 볼 수 있습니다. –

답변

6

반환 후 "finally"블록을 실행합니다. "마지막으로"같은 가까운 데이터베이스 연결로 연습에 사용되는

+0

'using '을 사용하면 마침내 필요 없다고 생각할 것입니다. – Dialecticus

+0

using은 IDisposeable 인터페이스를 구현하는 인스턴스에만 적용될 수 있으며 컴파일러는 사용 블록을 적절한 try ... finally 블록으로 변환합니다. 편집 : ICloneable을 IDisposable로 바꿨습니다. – Dennis

+0

@Dialectus : 컴파일러가 'finally'블록을 사용하여 'Dispose'를 호출하도록하는 구문 설탕을 사용한다는 점을 감안하면 합리적인 가정입니다. –

2

finally 블록이 항상 실행됩니다. 귀하의 경우 그것은 귀환 신고서 전에 실행됩니다.

+0

나는 finally 문이 return 문 다음에 실행되었다고 생각하지만 실행이 호출 함수로 돌아 가기 전에 생각합니다. return -> finally -> 되돌아갑니다. – Dialecticus

+0

Debbuger는 finally 문을 먼저 반환하고 finally 문을 반환합니다. 그러나 프로그램은 finally 블록으로 이동 한 후 메서드를 종료 한 후 이동합니다. 그래서 합리적으로 말하면 finally 블록은 return (메서드를 남겨두기) 문 앞에 실행됩니다. – Nicolas

+5

C# 언어 사양은 순서대로 매우 명확합니다. 1)'return' 문장의 표현식이 평가됩니다. 2) finally 블록이 실행됩니다. 블록), 3) 제어가 호출자에게 리턴된다. 따라서,'finally'는'return' 문이 평가 된 후에 * 실행되고 * 호출자에게 * 제어가 되돌아 오기 전에 실행됩니다. –

1

당신은

private bool test() 
    { 
     try 
     { 
      int i = 0; 
      int u = 10/i; 
     } 

     catch (Exception) 
     { 
      return false; 
     } 
     finally 
     { 

     } 
     return true; 
    } 

그래서 그것이 divideby 제로 예외가 자기와 함께 시도 할 수 있습니다 (항상 수행해야). 이 코드를 실행하면 finally가 실행되고 return이 실행됩니다.

런타임과 같이 finally 블록의 경우 반환되는 결과입니다!

0

finally 블록은 코드가 try-catch-finally 블록을 종료하기 전에 항상 실행됩니다 (ThreadAbortException과 같은 조건으로 인해 finally 블록이 실행되지 않도록하여 try-catch-finally 블록을 종료하지 못하게합니다).