bdfgdfg

[C#] 예외처리(try-catch) 본문

게임프로그래밍/C#

[C#] 예외처리(try-catch)

marmelo12 2022. 4. 22. 15:39
반응형

프로그램이 어떠한 문제로 인해 프로그래머의 의도대로 흘러가지 않는 사건을 예외.

이러한 예외를 오류로 이어지지 않도록 적절하게 처리하는 것을 예외 처리(Exception Handling)이라 한다.

 

간단하게, 크기가 3인 배열을 할당하고, 할당된 메모리의 크기를 넘어서서 접근하는 코드를 만들어보자.

 -> 버퍼 오버플로우

ㅣㄴ

인덱스가 배열의 범위를 벗어나 에러가 발생.

심지어 실행을 해보면 CLR이 직접 에러 메시지를 로그로 남겨준다.

 

이렇게 잘못된 인덱스를 통해 배열의 요소에 접근하려 들면 배열 객체가 이 문제에 대한 상세정보를 IndexOutOfRangeException의 객체에 담은 후 Main메소드에 던지고, Main메소드는 이 예외를 처리할 방도가 없기에 다시 CLR에게  던진다.

 -> CLR에게까지 전달된 예외는 처리되지 않은 예외라 한다.

 

이러한 예외 발생을 우리가 직접 핸들링 해본다.

 

try~catch로 예외 받기

위 예제에서 Main메소드가 IndexOutOfRangeException 예외를 처리하지 못했기에 CLR에 던진다고 했다.

그렇다면 Main메소드가 이러한 예외를 받아서 처리하게끔 하면 된다!

1
2
3
4
5
6
7
8
9
10
11
12
13
try
{
    //실행하고자 하는 코드(즉 일반적인 코드)
}
catch(예외 객체)
{
    // 예외가 발생했을 때의 처리
}
catch(예외 객체)
{
    // 예외가 발생했을 때의 처리
}
 
cs

catch절은 try블록에서 던질 예외 객체와 형식이 일치해야 한다, 그렇지 않으면 던져진 예외를 아무도 받지 못해 처리되지 않은 예외로 간주된다.

 

이제 이 try~catch를 통해 위의 배열문제를 한번 해결해보자.

프로그램이 터지지 않고, 메인함수를 벗어나면서 프로그램이 종료가 된다.

 

System.Exception 클래스

System.Exception 클래스는 모든 예외의 조상이다. C#에서 모든 예외 클래스는 반드시 이 클래스로부터 상속받는다.

 -> IndexOutOfRangeException도 마찬가지!

 

그럼 한가지 사실을 알 수 있다. 상속관계? 그렇다면 최상위 부모인 System.Exception 객체하나로 모든 예외를 다 받을 수 있지않냐는 것.

다만 이게 만능은 아니고, 프로그래머가 생각한 발생가능 예외말고도 다른 예외까지 받아버리는 상황이 발생할 수 있으므로 의미 없는 예외처리를 처리해버릴 수 있다.

 -> 그렇기에 System.Exception을 무조건 쓰는게 아닌, 처리되지 않아야 할 예외까지 처리하는 문제가 발생할 수 있는지 신중히 확인해야 한다.

 

예외 던지기

try~cath문으로 예외를 받는다는 건 어디선가 예외를 던진다는 이야기.

예외는 throw문을 통해 던진다.

C# 7.0부터는 이러한 throw를 식(expression)으로도 사용할 수 있도록 개선되었다.

??연산자는 https://velog.io/@jinuku/C-%EB%B0%8F-.-%EC%97%B0%EC%82%B0%EC%9E%90 를 살펴보자.

 

또한 배열의 인덱스에 접근할 때 삼항 연산자를 이용해 간단하게 예외를 던질 수 있다.

 

또한 try~catch 구문에서 같이 쓰일 수 있는 finally절도 존재한다.

finally절은 try~catch에서 어떤 경우에도 실행된다.

 -> 예외가 일어나건 일어나지 않건 무조건 finally절은 들어간다.

 -> DB 커넥션을 끊는 등 중요한 처리를 할 때 finally절은 필요하다.

 

또한 C# 6.0부터 catch절이 받아들일 예외 객체에 제약 사항을 명시할 수 있다.

 -> 해당 조건을 만족하는 예외 객체에 대해서만 예외 처리를 진행. (즉 예외 필터!)

어렵지 않다. catch문 뒤에 when 키워드를 이용하면 된다. (when을 if라고 생각하고 리딩하면 편하다)

반응형

'게임프로그래밍 > C#' 카테고리의 다른 글

Interlocked  (0) 2022.12.13
Linq - Group by  (0) 2022.11.05
[C#] 일반화(제네릭) 프로그래밍  (0) 2022.04.21
[C#] 인덱서(Indexer)  (0) 2022.04.21
[C#] 프로퍼티(갓)  (0) 2022.04.19
Comments