c# try-catch, finally, throw

2024. 9. 18. 18:23c#

C#의 예외 처리: try-catch와 throw

C#에서 예외 처리는 프로그램의 흐름을 제어하고 예기치 않은 오류를 처리하기 위한 중요한 기능입니다. 예외가 발생했을 때 프로그램이 갑작스럽게 종료되는 것을 방지하고, 오류가 발생했을 때 어떻게 처리할지 명시적으로 결정할 수 있게 도와줍니다. 이번 포스팅에서는 C#의 예외 처리에서 핵심적인 개념인 try-catchthrow에 대해 설명하겠습니다.


1. 예외(Exception)란?

예외란 프로그램이 실행 중에 발생하는 오류 상황을 말합니다. 예외는 프로그래머가 미리 예측하지 못한 상황이나 잘못된 입력값 등으로 인해 발생할 수 있습니다. 예외는 프로그램의 비정상적인 종료를 유발할 수 있기 때문에, 이를 처리하는 방법을 잘 이해하는 것이 중요합니다.

예를 들어, 숫자를 0으로 나누는 시도는 DivideByZeroException 예외를 발생시킵니다.

int x = 10;
int y = 0;
int result = x / y;  // 예외 발생: DivideByZeroException

 


2. try-catch 블록

try-catch 블록은 예외를 처리하기 위한 구조입니다.
try 블록에는 예외가 발생할 수 있는 코드가 포함되며,
catch 블록은 예외가 발생했을 때 실행할 코드를 정의합니다.

try-catch 구조

try
{
    // 예외가 발생할 수 있는 코드
}
catch (Exception ex)
{
    // 예외 처리 코드
}

예제: 0으로 나누기 예외 처리

try
{
    int x = 10;
    int y = 0;
    int result = x / y;  // 예외 발생
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("0으로 나눌 수 없습니다.");
}

이 예제에서, y가 0이므로 DivideByZeroException이 발생하지만, 프로그램이 중단되지 않고 catch 블록에서 예외를 처리하여 "0으로 나눌 수 없습니다."라는 메시지를 출력합니다.

다중 catch 블록

여러 유형의 예외를 처리해야 하는 경우, 다중 catch 블록을 사용할 수 있습니다. 각 블록은 특정 예외 타입에 맞춰 예외를 처리합니다.

try
{
    int[] numbers = { 1, 2, 3 };
    Console.WriteLine(numbers[10]);  // 배열 인덱스 범위 초과 예외 발생
}
catch (IndexOutOfRangeException ex)
{
    Console.WriteLine("배열의 인덱스가 범위를 초과했습니다.");
}
catch (Exception ex)
{
    Console.WriteLine("일반적인 오류가 발생했습니다.");
}

여기서 IndexOutOfRangeException이 발생하면 해당 예외가 처리되고, 그 외의 일반적인 예외는 두 번째 catch 블록에서 처리됩니다.


3. finally 블록

finally 블록은 try-catch 구조와 함께 사용할 수 있으며, 예외가 발생하든 발생하지 않든 반드시 실행되는 코드를 정의하는 데 사용됩니다. 주로 리소스를 해제하거나 정리 작업을 할 때 유용합니다.

finally 블록 예제

try
{
    int x = 10;
    int y = 0;
    int result = x / y;  // 예외 발생
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("0으로 나눌 수 없습니다.");
}
finally
{
    Console.WriteLine("프로그램이 종료됩니다.");
}

이 예제에서는 예외가 발생하더라도 finally 블록이 실행되어 "프로그램이 종료됩니다." 메시지가 출력됩니다.


4. throw 키워드

throw 키워드는 예외를 직접 발생시키거나, 이미 발생한 예외를 다시 던질 때 사용됩니다. 예외를 수동으로 발생시켜 특정 조건에서 오류를 알리거나, 예외를 다시 던져 더 높은 레벨에서 처리할 수 있게 할 수 있습니다.

throw를 사용하여 예외 발생시키기

public void CheckNumber(int number)
{
    if (number < 0)
    {
        throw new ArgumentOutOfRangeException("number", "숫자는 0보다 작을 수 없습니다.");
    }
}

이 코드는 number가 0보다 작은 경우 ArgumentOutOfRangeException 예외를 발생시킵니다.
예외가 발생하면 프로그램의 흐름이 중단되고 예외 처리가 필요한 위치로 넘어갑니다.

throw를 사용하여 예외 다시 던지기

때로는 예외를 처리한 후, 해당 예외를 다시 던져 더 높은 수준의 코드에서 처리할 필요가 있습니다.
이때 throw를 사용하여 예외를 다시 던질 수 있습니다.

try
{
    // 예외가 발생할 수 있는 코드
}
catch (Exception ex)
{
    // 예외를 처리하고 다시 던짐
    throw;
}

throw 키워드를 통해 예외를 다시 던지면, 상위 코드에서 추가적인 예외 처리를 할 수 있습니다.


5. 예외 처리의 중요성

예외 처리는 프로그램이 예기치 않은 상황에서도 안정적으로 동작할 수 있게 해줍니다. 다음은 예외 처리가 중요한 이유입니다:

  • 프로그램의 안정성 보장: 예외를 처리하지 않으면 프로그램이 강제로 종료될 수 있으며, 이는 사용자에게 나쁜 경험을 제공합니다.
  • 디버깅 및 문제 해결에 도움: 예외 처리는 오류가 발생한 원인을 파악하고, 문제를 해결하는 데 유용한 정보를 제공합니다.
  • 리소스 관리: 파일, 데이터베이스 연결 등 시스템 리소스를 사용할 때 예외 처리를 통해 적절히 리소스를 해제하고 관리할 수 있습니다.

 

C#에서 try-catchthrow는 예외 처리를 위한 강력한 도구입니다. try-catch를 통해 프로그램이 중단되지 않고 예외를 안전하게 처리할 수 있으며, throw를 사용하여 조건에 따라 예외를 발생시키거나 다시 던질 수 있습니다. 또한 finally 블록을 통해 리소스 정리 작업을 할 수 있습니다.

예외 처리는 안정적인 코드 작성을 위한 필수적인 기술이므로, 이를 적절히 활용하여 견고한 프로그램을 작성해 보세요!