try-finally(C# 참조)try-finally (C# Reference)

finally 블록을 사용하면 try 블록에서 할당된 리소스를 정리할 수 있으며, try 블록에서 예외가 발생하는 경우에도 코드를 실행할 수 있습니다.By using a finally block, you can clean up any resources that are allocated in a try block, and you can run code even if an exception occurs in the try block. 일반적으로 finally 블록의 문은 제어가 try 문을 벗어날 때 실행됩니다.Typically, the statements of a finally block run when control leaves a try statement. 제어 전송은 정상적인 실행 결과, break, continue, goto 또는 return 문의 실행 결과 또는 try 문에서 예외 전파의 결과로 발생할 수 있습니다.The transfer of control can occur as a result of normal execution, of execution of a break, continue, goto, or return statement, or of propagation of an exception out of the try statement.

처리된 예외 내에서는 연결된 finally 블록이 항상 실행됩니다.Within a handled exception, the associated finally block is guaranteed to be run. 그러나 예외가 처리되지 않은 경우 finally 블록의 실행 여부는 예외 해제 작업의 트리거 방법에 따라 달라집니다.However, if the exception is unhandled, execution of the finally block is dependent on how the exception unwind operation is triggered. 트리거 방법은 다시 사용자 컴퓨터의 설정 방법에 따라 달라집니다.That, in turn, is dependent on how your computer is set up.

일반적으로 처리되지 않은 예외로 애플리케이션이 종료되는 경우 finally 블록의 실행 여부는 중요하지 않습니다.Usually, when an unhandled exception ends an application, whether or not the finally block is run is not important. 그러나 해당 상황에서도 실행해야 하는 문이 finally 블록에 있는 경우 한 가지 솔루션은 catch 블록을 try-finally 문에 추가하는 것입니다.However, if you have statements in a finally block that must be run even in that situation, one solution is to add a catch block to the try-finally statement. 또는 호출 스택에서 상위 try-finally 문의 try 블록에 throw될 수 있는 예외를 catch할 수 있습니다.Alternatively, you can catch the exception that might be thrown in the try block of a try-finally statement higher up the call stack. 즉, try-finally 문을 포함하는 메서드를 호출하는 메서드, 해당 메서드를 호출하는 메서드 또는 호출 스택의 임의 메서드에 예외를 catch할 수 있습니다.That is, you can catch the exception in the method that calls the method that contains the try-finally statement, or in the method that calls that method, or in any method in the call stack. 예외가 catch되지 않는 경우 finally의 실행은 운영 체제에서 예외 해제 작업 트리거를 선택하는지 여부에 따라 달라집니다.If the exception is not caught, execution of the finally block depends on whether the operating system chooses to trigger an exception unwind operation.

예제Example

다음 예제에서는 잘못된 변환 문으로 인해 System.InvalidCastException 예외가 발생합니다.In the following example, an invalid conversion statement causes a System.InvalidCastException exception. 예외가 처리되지 않습니다.The exception is unhandled.

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

        try
        {
            // Invalid conversion; obj contains a string, not a numeric type.
            i = (int)obj;

            // The following statement is not run.
            Console.WriteLine("WriteLine at the end of the try block.");
        }
        finally
        {
            // To run the program in Visual Studio, type CTRL+F5. Then 
            // click Cancel in the error dialog.
            Console.WriteLine("\nExecution of the finally block after an unhandled\n" +
                "error depends on how the exception unwind operation is triggered.");
            Console.WriteLine("i = {0}", i);
        }
    }
    // Output:
    // Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
    //
    // Execution of the finally block after an unhandled
    // error depends on how the exception unwind operation is triggered.
    // i = 123
}

다음 예제에서는 TryCast 메서드의 예외가 호출 스택의 위에 있는 메서드에서 catch됩니다.In the following example, an exception from the TryCast method is caught in a method farther up the call stack.

public class ThrowTestB
{
    static void Main()
    {
        try
        {
            // TryCast produces an unhandled exception.
            TryCast();
        }
        catch (Exception ex)
        {
            // Catch the exception that is unhandled in TryCast.
            Console.WriteLine
                ("Catching the {0} exception triggers the finally block.",
                ex.GetType());

            // Restore the original unhandled exception. You might not
            // know what exception to expect, or how to handle it, so pass 
            // it on.
            throw;
        }
    }

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

        try
        {
            // Invalid conversion; obj contains a string, not a numeric type.
            i = (int)obj;

            // The following statement is not run.
            Console.WriteLine("WriteLine at the end of the try block.");
        }
        finally
        {
            // Report that the finally block is run, and show that the value of
            // i has not been changed.
            Console.WriteLine("\nIn the finally block in TryCast, i = {0}.\n", i);
        }
    }
    // Output:
    // In the finally block in TryCast, i = 123.

    // Catching the System.InvalidCastException exception triggers the finally block.

    // Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
}

finally에 대한 자세한 내용은 try-catch-finally를 참조하세요.For more information about finally, see try-catch-finally.

C#에는 IDisposable 개체에 대한 유사한 기능을 편리한 구문으로 제공하는 using 문도 포함되어 있습니다.C# also contains the using statement, which provides similar functionality for IDisposable objects in a convenient syntax.

C# 언어 사양C# language specification

자세한 내용은 C# 언어 사양try 문 섹션을 참조하세요.For more information, see The try statement section of the C# language specification.

참고 항목See also