정신과 시간의 방
카테고리
작성일
2022. 8. 22. 23:14
작성자
risehyun

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해서 별도로 처리할 수 있다.