0

을 나는 다음과 같은 C# 코드가 있습니다제어 흐름은 예외가의 try 블록에서 발생하는 경우 결국 차단을 통해 전달되지 시도 - 마지막

public class Program 
    { 
     static void Main() 
     { 
      int i = 123; 
      string s = "Some string"; 
      object obj = s; 

      try 
      { 
       // Invalid conversion; 
       i = (int)obj; 

       // The following statement is not run. 
       Console.WriteLine("WriteLine at the end of the try block."); 
      } 
      finally 
      { 
       Console.WriteLine("\n Finally Block executed !!!"); 
      } 
     } 
    } 

예외가 finally 블록으로 제어를 통과하지 않고 프로그램이 충돌 발생 try 블록에서 얻은 리소스를 해제하려면 finally 블록을 실행해야한다는 것을 이해해야합니다.

+0

당신이에서 볼 수있는 바와 같이,이 바이올린은] (https://dotnetfiddle.net/wf8DN9), 이것은 사실이 아니다. 자신의 문제를 나타내는 [mcve]를 제공하십시오. –

+0

네, dotnetfiddle에서 작동하지만 Visual Studio 2013에서 실행 한 후에는 컨트롤을 통과하지 않고 다음과 같은 예외를 throw하여 최종적으로 블록을 먼저 처리합니다. 처리되지 않은 예외 : System.InvalidCastException : 지정한 캐스트가 유효하지 않습니다. at exceptionHandling.Program.Main() in c : \ Users \ Kifayat \ Desktop \ Learn \ excepti onHandling \ exceptionHandling \ Program.cs : 줄 69 –

+2

여전히 실행됩니다. 아마도 Visual Studio가 finally 블록이 실행되기 전에 처리되지 않는 예외를 깨기 때문일 수 있습니다. 'Run'을 다시 누르면 finally 블록이 실행됩니다. –

답변

0

일반적으로 처리되지 않은 예외가 응용 프로그램을 종료하면 finally 블록의 실행 여부가 중요하지 않습니다. 그러나 finally 블록에 해당 상황에서도 실행해야하는 문이있는 경우 try-finally 문에 catch 블록을 추가하는 것이 하나의 솔루션입니다. 또는 호출 스택 위로 올라온 try-finally 문의 try 블록에서 throw 될 수있는 예외를 catch 할 수 있습니다. 즉, try-finally 문이 포함 된 메서드를 호출하는 메서드 나 해당 메서드를 호출하는 메서드 또는 호출 스택의 메서드에서 예외를 catch 할 수 있습니다. 예외가 포착되지 않으면 finally 블록의 실행은 운영 체제가 예외 unwind 작업을 트리거하도록 선택했는지 여부에 따라 다릅니다.

심판 : https://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

이 유효성을 검사하려면,이 같은 샘플을 시도하고 마침내 블록 실행. 이 시도 :

public class MainClass { 
public static void Main() 
{ 
    try { 
     Invalid(); 
    } 
    catch (Exception ext) { 
     Console.Write(ext.Message); 
    } 
} 

public static void Invalid() 
{ 
    string message = "new string"; 
    object o = message; 
    try 
    { 
     int i = (int)o; 
    } 
    finally 
    { 
     Console.WriteLine("In finally"); 
    } 
} 
} 
+0

'해결책'이 필요하지 않습니다. finally 블록은 항상 실행됩니다. –