C++ 쟁이가 C#을 배워보자 - 예외처리

 이번 포스트에서는 C#의 예외처리에 대해서 정리를 하였다. try, catch, finally같이 기존 프로그래밍 언어에서도 거의 유사한 부분은 제외하고, C++과 비교할 때 다른 것들만 추렸다.

1. using으로 리소스 해제 단순화

 파일 스트림같이 객체를 생성하고 사용한 다음에는 명시적으로 해제가 필요한 케이스가 있다. 이럴 때 using을 사용하여 객체를 생성한 후에 컴파일하게 되면 catch 구문이 없는 try~finally 구문으로 변경되게 된다.
using (FileStream fs = File.OpenWrite(Path.Combine(path, "result.txt")))
{
    using (StreamWriter sw = new StreamWriter(fs))
    {
        try
        {
            sw.WriteLine("Welcome, .NET Core!");
        }
        catch (Exception ex)
        {
            System.Console.WriteLine($"{ex.GetType()} says {ex.Message}");
        }
    } // sw가 null이 아니면 자동으로 Dispose 호출
} // fs가 null이 아니면 자동으로 Dispose 호출

2. overflow 검사

checked

개발을 하다보면 숫자형 변수를 조작을 하거나 타입 변환을 할 때 의도하지 않게 최대/최소 범위를 벗어난 값이 지정되는 경우가 있다. 이런 경우 일반적으로는 자연스럽게 overflow가 일어나 스비슬쩍(?) 넘어갈 수 있으나 C#에서는 checked문을 통해 확실하게 예외를 발생시킬 수 있다.
checked
{
    int val = 70000;
    short sh = (short)val;
    System.Console.WriteLine($"{sh}");
}

위 코드는 타입 변환 포스트에서 사용한 데이터 잘림 예제코드이다. int → short로 변환되면서 값이 overflow되는데, 위 코드처럼 checked로 묶어주면 overflow 발생 시 확실한 예외를 던지게 된다.
checked
{
    int val = int.MaxValue - 1;
    val += 10;
}

위와 같이 타입 변환이 아닌 단일 변수의 조작의 경우에도 overflow가 발생하게 되면 checked 문은 확실하게 예외를 발생시킨다.위 코드에 try-catch 구문을 사용하면 런타임시의 예외 발생을 처리할 수 있게 된다.

try
{
    checked
    {
        int val = int.MaxValue - 1;
        val += 10;
    }
}
catch(OverflowException)
{
    //여기서 overflow 예외에 대한 처리
} 
 

unchecked

사실 이 부분은 개발하면서 맞닥뜨릴 일이 거의 없을 것으로 보여지지만...코드상에서 명백하게 overflow를 발생시키는 부분이 있으면 컴파일 시 에러가 발생하게 된다.

int m = int.MaxValue + 1;

위 코드는 단순히 정수형 최대값 + 1을 변수 m에 대입시키는 코드이다. 그러나 이걸 컴파일하면 아래와 같은 컴파일 에러가 발생한다.
error CS0220: checked 모드에서 컴파일하면 작업이 오버플로됩니다.
이럴 때 사용하는 것이 unchecked이다. checked와 마찬가지로 에러가 발생하는 코드를 unchecked로 감싸주면 컴파일 시 에러가 발생하지 않는다. 쓸 일은 없겠지만 일단 정리;;;
unchecked
{
    int m = int.MaxValue + 1;
}

댓글

가장 많이 본 글