C#프로그래밍 17 : 예외처리

LeeWonjin·2022년 5월 24일
0

[학부]C#프로그래밍

목록 보기
17/21

처리되지 않은 예외의 발생과정

배열의 범위밖 인덱스 접근의 경우

static void Main(string[] args)
{
    int[] arr = { 5, 3 , 53, 5353 };
    Console.WriteLine(arr[535353]);
}
  1. 예외발생
  2. Array객체가 IndexOutofRangeException를 생성, 정보 적재
  3. IndexOutofRangeException이 Main으로 던져짐
  4. 그러나 Main에 예외처리기가 없으므로 CLR로 다시 던져짐
  5. CLR에서 Unhandled Exception으로 처리하고 프로그램 강제종료

기본 예외처리

예외가 발생하지 않도록 사전에 처리

static void Main(string[] args)
{
    int[] arr = { 5, 3 , 53, 5353 };

    while (true)
    {
        string line = Console.ReadLine();
        int idx = int.Parse(line);

        // 입력 1 --> OUT : 3
        // 입력 5 --> Invalid index

        if (idx >= 0 && idx < arr.Length)
            Console.WriteLine($"OUT : {arr[idx]}");
        else
            Console.WriteLine("Invalid index");
    }
}

System.Exception 클래스

C#의 모든 에러클래스는 System.Exception을 상속받는다.

CLR에 사전정의된 에러는 System.Exception을 상속받는 System.SystemException을 상속받는다.

사용자 에러는 기존에는 System.ApplicationException을 상속받는 것이 일반적이었으나, 최근의 국룰은 System.Exception을 바로 상속받는 것

try~catch (고급 예외처리)

try{} catch{}패턴으로 사용한다.
finally{}는 try문이 return되거나 catch가 실행된 경우에도 무조건 실행된다.
단, finally{}안에서 return은 사용할 수 없다.

static void Main(string[] args)
{
    int[] arr = { 5, 3 , 53, 5353 };

    while (true)
    {
        try
        {
            Console.WriteLine("====================");
            string line = Console.ReadLine();
            int idx = int.Parse(line);
            Console.WriteLine($"OUT : {arr[idx]}");
        }
        catch(IndexOutOfRangeException err)
        {
            Console.WriteLine($"Message : {err.Message}");
            Console.WriteLine($"Source : {err.Source}");
            Console.WriteLine($"StackTrace : {err.StackTrace}");
            Console.WriteLine($"ToString() : {err.ToString()}");
        }
        catch (Exception err)
        {
            Console.WriteLine("Another Error Type");
            Console.WriteLine(err);
        }
        finally
        {
            Console.WriteLine("----finally");
        }
    }
}

throw

throw 문 아래와 같이 사용가능

while (true)
{
    try
    {
        Console.WriteLine("====================");
        string line = Console.ReadLine();
        throw new Exception("I am Exception");
    }
    catch (Exception err)
    {
        Console.WriteLine("Another Error Type");
        Console.WriteLine(err);
    }

throw 식으로도 사용 가능 (삼항연산자에서 사용 등 가능)

사용자 정의 예외

System.Exception을 상속한 클래스를 선언하고, 이 클래스의 객체를 생성해 throw한다.

static void Main(string[] args)
{
    int[] arr = { 5, 3 , 53, 5353 };

    while (true)
    {
        try
        {
            Console.WriteLine("====================");
            string line = Console.ReadLine();
            int n = int.Parse(line);
            if (n <= 53)
                throw new SmallValueException(n);
        }
        catch (SmallValueException err)
        {
            Console.WriteLine(err.Message);
            Console.WriteLine(err);
        }
        catch (Exception err)
        {
            Console.WriteLine("All Error Type");
            Console.WriteLine(err);
        }
    }
}

예외 필터

catch(Exception err) when (조건식)
과 같이 catch블록이 실행될 조건을 달아 예외를 필터링할 수 있음

static void Main(string[] args)
{
    int[] arr = { 5, 3 , 53, 5353 };

    while (true)
    {
        try
        {
            Console.WriteLine("====================");
            string line = Console.ReadLine();
            int n = int.Parse(line);
            if (n <= 53)
                throw new SmallValueException(n);
        }
        catch (SmallValueException err) when (err.isNegative())
        {
            Console.WriteLine("[ N E G A T I V E ]");
            Console.WriteLine(err.Message);
            Console.WriteLine(err);
        }
        catch (SmallValueException err) when (!err.isNegative())
        {
            Console.WriteLine("[ P O S I T I V E ]");
            Console.WriteLine(err.Message);
            Console.WriteLine(err);
        }
        catch (Exception err)
        {
            Console.WriteLine("All Error Type");
            Console.WriteLine(err);
        }
    }
}
profile
노는게 제일 좋습니다.

0개의 댓글