C#과 유니티로 만드는 MMORPG 게임 개발 시리즈 강의를 수강하며 예외처리 파트에서 배우고 느낀 점을 정리해보았다.
- 예외처리란?
- 예상치 못한 예외적인 상황에 대한 처리를 뜻한다.
- 게임 쪽에서는 잘 안쓰는 경향이 있다.
-> 왜? 게임에서는 예외처리를 따로 하기보다는 크래쉬가 나도록 두고, 빠르게 수정하는 쪽으로 처리함. (한 사람이 예외가 발생한다는 건 다른 사람들도 모두 똑같이 예외가 발생한다는 것이므로 한 사람만 따로 예외처리하는 것이 의미가 없다.)
-> 단, 심각한 예외가 아니거나 네트워크 관련 예외의 경우에는 catch해서 처리할 수 있다. - 예외처리 문법 (try ~ catch, finally)
static void Main(string[] args)
{
try // 1. 먼저 try구문 안의 코드를 한 번 실행해보고
{
// 여기서 예외적인 상황이란?
// : 프로그램이 정상적으로 실행되지 않는 상황으로 아래와 같은 예시가 있음
// 1. 값을 0으로 나눌 때. 0으로 나누면 아무것도 나눠지지 않으므로 오류발생
// 2. 잘못된 메모리를 참조하는 경우
// (null || 캐스팅 오류로 잘못된 타입을 가지는 경우)
// 3. 복사시 너무 많은 데이터를 복사하여 오버플로우가 발생한 경우
// 4. 스택이나 힙 메모리를 잘못 건드렸을 때
// 1번 예외를 활용한 예제
int a = 10;
int b = 0;
int result = a / b; // 0으로 값을 나눴기 때문에 예외가 발생함
}
catch (DivideByZeroException e) // 세부예외처리 -> 0으로 나누는 경우.
{
}
catch (Exception e) // 2. 실행도중 예외적인 결과가 발생한다면
// 해당 예외에 대한 처리를 여기서 실행함
// Exception의 경우 모든 예외를 커버할 수 있고,
// 그 밖에 세부적으로 예외를 처리할 수도 있다.
// 단, Exception이 전체 예외를 커버하기 때문에
// 세부 예외처리보다 Exception이
// 앞에 오면 오류가 발생하여 실행이 되지 않는다.
// 그러므로 이 부분이 DivideByZeroException의 뒤에 와야 한다.
{
}
finally // try 문에서 예외가 발생하면 바로 catch문으로 빠지기 때문에
// try 스코프 안에서 예외가 발생한 줄 아래에 있는 코드들은 실행되지 않는다.
// 따라서 try catch문과 상관없이 반드시 실행되어야 하는 경우에는
// 여기에 해당 코드를 입력해서 실행되도록 따로 빼주어야 한다.
// 이 키워드의 활용으로는 파일 입출력이나 데이터베이스 연결같은 작업을 할 때,
// try 스코프에서 접속 코드를, finally 스코프 안에서는
// 해당 DB, 파일 내용을 정리하는 부분을 넣는 방법이 있다.
{
}
}
- 직접 에러 Exception을 만드는 방법
class Program
{
class TestException : Exception // 커스팀 예외처리 클래스를 만들기 위해서는
// 반드시 Exception을 상속받아야 한다.
{
}
static void Main(string[] args)
{
try
{
throw new TestException(); // 새로 만든 예외를 던지면 catch가 받아줌
}
catch (Exception e)
{
}
}
}
[결론]
try~catch 구문을 사용하여 예외 상황에 대한 처리를 간편하게 할 수 있다.
다양한 상황에서 발생하는 예외에 대해서 대처할 수 있으며,
네트워크 통신 오류 등의 덜 치명적인 상황에 대해서도 catch해서 별도로 처리할 수 있다.
'C#' 카테고리의 다른 글
220823 Nullable (널러블) (0) | 2022.08.23 |
---|---|
220823 Reflection and attributes (리플렉션과 애트리뷰트) (0) | 2022.08.23 |
220822 Event (이벤트) (0) | 2022.08.22 |
[C#] Delegate (대리자) (0) | 2022.08.21 |
220820 Property (프로퍼티) + 식 본문 멤버 (Expression-bodied members) (0) | 2022.08.20 |