다음을 통해 공유


예외 처리(C# 프로그래밍 가이드)

업데이트: 2007년 11월

try 블록은 C# 프로그래머가 예외의 영향을 받을 수 있는 코드를 분할하는 데 사용되고, catch 블록은 예외 결과를 처리하는 데 사용됩니다. finally 블록은 예외의 throw 여부에 관계없이 코드를 실행하는 데 사용될 수 있습니다. 이는 예외가 throw되어 try/catch 구문 뒤의 코드가 실행되지 않는 경우에 필요할 수 있습니다. try 블록은 catch 또는 finally 블록과 함께 사용해야 하며 여기에는 catch 블록이 여러 개 포함될 수 있습니다. 예를 들면 다음과 같습니다.

try
{
    // Code to try here.
}
catch (SomeSpecificException ex)
{
    // Code to handle exception here.
    // Only catch exceptions you know how to handle.
    // Never catch base class System.Exception without
    // rethrowing it at the end of the catch block.
}
try
{
    // Code to try here.
}
finally
{
    // Code to execute after try here.
}
try
{
    // Code to try here.
}
catch (SomeSpecificException ex)
{
    // Code to handle exception here.
}
finally
{
    // Code to execute after try (and possibly catch) here.
}

try 문에 catch 또는 finally 블록이 없으면 컴파일러 오류가 발생합니다.

catch 블록

catch 블록에서는 catch할 예외 형식을 지정할 수 있습니다. 이 형식을 예외 필터라고 하며 이는 Exception에서 파생된 형식이어야 합니다. 일반적으로, try 블록에서 throw될 수 있는 모든 예외를 처리하는 방법을 명확히 알고 있거나 catch 블록의 끝에 throw 문을 포함하는 경우가 아니라면 catch 블록에 Exception을 지정해서는 안 됩니다.

예외 필터가 서로 다른 여러 개의 catch 블록을 함께 연결할 수 있습니다. catch 블록이 여러 개인 경우 각 블록은 위에서 아래 순으로 실행되지만 throw된 각 예외에 대해서는 catch 블록이 하나만 실행됩니다. throw된 예외의 정확한 형식이나 기본 클래스를 지정하는 첫 번째 catch 블록이 실행됩니다. 일치하는 예외 필터를 지정하는 catch 블록이 없는 경우 필터가 없는 catch 블록(있는 경우)이 실행됩니다. catch 블록은 가장 구체적인, 즉 가장 많이 파생되는 예외 클래스에 먼저 배치해야 합니다.

다음 조건에 해당되면 예외를 catch해야 합니다.

  • 예외가 throw된 이유에 대해 자세히 이해하고 있고, 적절한 복구를 구현할 수 있는 경우입니다. FileNotFoundException 개체를 catch하여 사용자에게 새 파일 이름을 입력하라는 메시지를 표시하는 경우를 예로 들 수 있습니다.

  • 더 구체적인 새 예외를 만들고 throw할 수 있는 경우입니다. 예를 들면 다음과 같습니다.

    int GetInt(int[] array, int index)
    {
        try
        {
            return array[index];
        }
        catch(System.IndexOutOfRangeException e)
        {
            throw new System.ArgumentOutOfRangeException(
                "Parameter index is out of range.");
        }
    }
    
  • 예외를 부분적으로 처리할 수 있는 경우입니다. 예를 들어 catch 블록을 사용하여 오류 로그에 항목을 추가한 다음 예외를 다시 throw하여 이어지는 예외 처리를 허용할 수 있습니다. 예를 들면 다음과 같습니다.

    try
    {
        // try to access a resource
    }
    catch (System.UnauthorizedAccessException e)
    {
        LogError(e);  // call a custom error logging procedure
        throw e;      // re-throw the error
    }
    

finally 블록

finally 블록을 사용하여 try 블록에서 수행한 작업을 정리할 수 있습니다. finally 블록이 있는 경우 이 블록은 try 및 catch 블록을 실행한 후에 실행됩니다. finally 블록은 예외가 throw되었는지 여부나 예외 형식이 일치하는 catch 블록을 찾았는지 여부와 상관없이 항상 실행됩니다.

finally 블록을 사용하면 런타임에 가비지 수집기가 개체를 종료할 때까지 기다리지 않고도 파일 스트림, 데이터베이스 연결, 그래픽 핸들 등의 리소스를 해제할 수 있습니다. 자세한 내용은 using 문(C# 참조)을 참조하십시오.

이 예제에서 finally 블록은 try 블록에 열려 있는 파일을 닫는 데 사용됩니다. 파일을 닫기 전에 파일 핸들의 상태를 검사합니다. try 블록에서 파일을 열지 못한 경우 파일 핸들은 계속 null로 설정됩니다. 파일을 성공적으로 열었지만 예외가 throw되지 않은 경우에도 finally 블록이 실행되고 열려 있는 파일이 닫힙니다.

System.IO.FileStream file = null;
System.IO.FileInfo fileinfo = new System.IO.FileInfo("C:\\file.txt");
try
{
    file = fileinfo.OpenWrite();
    file.WriteByte(0xF);
}
finally
{
    // check for null because OpenWrite
    // might have failed
    if (file != null)
    {
        file.Close();
    }
}

C# 언어 사양

자세한 내용은 C# 언어 사양에서 다음 단원을 참조하십시오.

  • 16 예외

  • 8.9.5 throw 문

  • 8.10 try 문

참고 항목

개념

C# 프로그래밍 가이드

참조

예외 및 예외 처리(C# 프로그래밍 가이드)

try-catch(C# 참조)

try-finally(C# 참조)

try-catch-finally(C# 참조)

기타 리소스

C# 참조