09 예외처리

vencott·2021년 6월 2일
0

C#

목록 보기
9/32

C#을 포함한 모든 .NET Framework 언어는 .NET의 System.Exception 클래스를 기본으로 한다

만약 Exception이 발생하였는데 프로그램에서 처리하지 않으면 Crash하여 종료된다

try, catch, finally

try, catch, finally 키워드를 사용해 Exception을 핸들링한다

try
{
   // 실행 문장들
}
catch (ArgumentException ex)
{
   // Argument 예외처리
}
catch (AccessViolationException ex)
{
   // AccessViolation 예외처리
}
finally
{
   // 마지막에 반드시 실행
}

throw

throw 키워드를 통해 Exception을 생성해 발생시키거나 상위 호출자에게 예외 처리를 이임할수 있다

catch문 내에서 throw를 사용하는 3가지 경우

1) catch에서 전달받은 Exception 객체 throw

throw ex;

catch(Exception ex)에서 전달받은 ex를 그대로 throw 한다

ex에 담긴 예외 정보를 그대로 보전할 수 있다는 장점이 있지만, Stack Trace 정보를 리셋하기 때문에 throw문 이전의 콜스택 정보를 유실하게 되므로 사용을 권장하지 않는다

2) 새로운 Exception 객체를 생성해서 throw

throw new MyException(msg, ex);

C#의 new 키워드를 사용해 catch에서 잡은 Exception을 Wrapping해 새로운 Exception 객체를 생성

catch에서 얻은 Exception 객체를 새 객체의 InnerException에 포함시켜 예외 정보를 보전해야 한다

3) only throw

throw;

Exception 객체 없이 그냥 throw만을 사용

catch문에서 잡힌 예외를 그대로 상위 호출자에게 전달(rethrow)

예외처리 예제

try
{
    // 실행 문장들
    Step1();
    Step2();
    Step3();
}
catch(IndexOutOfRangeException ex)
{
    // 새로운 Exception 생성하여 throw
    throw new MyException("Invalid index", ex);
}
catch(FileNotFoundException ex)
{    
    bool success = Log(ex);
    if (!success)
    {
        // 기존 Exception을 throw
        throw ex;
    }
}
catch(Exception ex)
{    
    Log(ex);
    // 발생된 Exception을 그대로 호출자에 전달
    throw;
}

출처: http://www.csharpstudy.com/

profile
Backend Developer

0개의 댓글