[C#] 예외 처리

장민제·2025년 4월 15일

C# Study

목록 보기
9/11
post-thumbnail

⛔ 예외 처리 (Exception Handling) ?

  • 프로그램 실행 중 발생할 수 있는 에러 상황을 처리하기 위한 메커니즘
  • 예외(Exception)는 일반적으로 비정상적인 상황을 객체로 표현한 것

적절한 예외 처리는 프로그램의 안정성을 높이고 디버깅을 용이하게 한다.

◾ 주요 예외 종류

예외 타입설명
DivideByZeroException0으로 나누려 할 때 발생
NullReferenceExceptionnull 객체에 접근하려고 할 때 발생
IndexOutOfRangeException배열 인덱스가 범위를 벗어났을 때 발생
FormatException형식이 잘못된 문자열을 숫자로 바꿀 때 발생
InvalidOperationException객체의 상태가 작업을 수행하기에 부적절할 때 발생

◾ 기본 구조

try
{
    // 예외가 발생할 수 있는 코드
}
catch (ExceptionType e)
{
    // 예외 발생 시 실행할 코드
}
finally
{
    // 예외 발생 여부와 관계없이 항상 실행되는 코드 (선택적)
}

◾ 예시

try
{
    int num1 = 10;
    int num2 = 0;
    int result = num1 / num2; // 여기서 예외 발생
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("0으로 나눌 수 없습니다!");
}
finally
{
    Console.WriteLine("프로그램 종료");
}

◾ 다중 예외 처리 예제

try
{
    Console.Write("숫자를 입력하세요: ");
    string input = Console.ReadLine();

    int num = int.Parse(input);           // FormatException 가능성
    int result = 100 / num;               // DivideByZeroException 가능성

    Console.WriteLine($"결과: {result}");
}
catch (FormatException fe)
{
    Console.WriteLine("숫자 형식이 잘못되었습니다.");
}
catch (DivideByZeroException de)
{
    Console.WriteLine("0으로 나눌 수 없습니다.");
}
catch (Exception e) // 모든 예외의 최상위 부모
{
    Console.WriteLine($"알 수 없는 오류 발생: {e.Message}");
}
finally
{
    Console.WriteLine("예외 처리를 마쳤습니다.");
}

try - 예외 처리가 발생할 수 있는 코드 작성
catch - 예외 처리
finally - 예외 발생 여부와 상관없이 항상 실행

catch 블록은 구체적인 예외 타입부터 위에 작성

◾ 사용자 정의 예외 처리

-> Exception 클래스를 상속받아 새로운 예외 클래스 정의

기본 구조

public class MyCustomException : Exception
{
    public MyCustomException(string message) : base(message) { }
}

throw new MyCustomException("CustomException");

사용 예시

// 사용자 정의 예외 클래스
public class NotEnoughManaException : Exception
{
    public NotEnoughManaException() : base("마나가 부족합니다.") { }

    public NotEnoughManaException(string message) : base(message) { }
}

public class Mage
{
    public int Mp { get; set; }

    public Mage(int mp)
    {
        Mp = mp;
    }

    public void CastSpell(int mpCost)
    {
        if (Mp < mpCost)
        {
            throw new NotEnoughManaException();  // 사용자 정의 예외 발생
        }

        Mp -= mpCost;
        Console.WriteLine("마법 시전!");
    }
}

// 실제 사용
try
{
    Mage mage = new Mage(5);
    mage.CastSpell(10);
}
catch (NotEnoughManaException ex)
{
    Console.WriteLine($"사용자 정의 예외 발생: {ex.Message}");
}

상황에 맞는 예외명을 통해 버그 상황을 명확하게 전달할 수 있다.
적절한 위치의 예외처리로 어디서 에러가 발생했는지 확인하고 수정해 유지보수를 쉽게 하자
-> 예외 처리를 남발하게 되면 가독성도 떨어지고, 성능도 저하 될 수 있다.


profile
Unity, C#

0개의 댓글