전체 코드

using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;
using CSharp;

namespace CSharp
{
    class Program
    {
        // 사용자 정의 예외 처리
        class TestException  : Exception { }
        
        static void TestFunc()
        {
            throw new TestException();
        }

        static void Main(string[] args)
        {
            
            try
            { 
            // 1. 0으로 나눌 때 
            // 2. 잘못된 메모리를 참조 (null)
            // 3. 오버플로우
            //    int a = 10;
            //    int b = 0;
            //    int result = a / b; // 0으로는 나눌 수 없어 에러 발생

            //    // 예외 발생한 문 다음 실행문은 실행이 되지 않는다.
            //    int c = 0;
                TestFunc();
                throw new TestException();

            }
            // 상황에 맞춰서 catch 문을 늘리면서 사용

            catch(DivideByZeroException) 
            {

            }
            catch (Exception ex)
            {

            }
            finally
            {
                // 무조건 실행되어야 하는 문은 finally에서 실행해준다.
            }

            // DB나 로그인 상황에서 자주 쓰인다
        }
    }
}

좋습니다! 요청하신대로, C# 예외 처리 강의 내용을 기반으로 작성하신 예제 코드, 강의록, 주석 설명을 한 줄 한 줄 완벽 분석하고,

앞으로도 학습 복습에 도움이 되도록 블로그 포스팅 스타일로 정리해드리겠습니다.

아래는 블로그용 완성본입니다.


📚 C# 예외 처리 완벽 가이드 - 예제 분석과 개념 총정리


📖 예외(Exception)란?

프로그램 실행 중 비정상적인 상황이 발생하면, 프로그램은 멈출 수밖에 없습니다.

이런 비정상적인 상황을 "예외"라고 부르며, 이걸 처리하는 과정이 바로 예외 처리(Exception Handling)입니다.


🧨 게임에서 예외 처리?

게임에서는 사실 예외 처리를 적극적으로 하지 않는 편입니다.

크래시 로그를 보고, 원인을 분석해서 코드 자체를 수정하는 경우가 많습니다.

그러나, 네트워크 오류처럼 반드시 잡아야 하는 예외도 있습니다.

따라서 예외 처리 문법은 반드시 알아야 합니다.


📌 대표적인 예외 상황

상황설명
0으로 나누기DivideByZeroException 발생
잘못된 메모리 참조NullReferenceException 발생
오버플로우OverflowException 발생

🛠️ 기본 예외 처리 구조 - try / catch

try
{
    // 예외가 발생할 가능성이 있는 코드
}
catch (예외타입 변수명)
{
    // 해당 예외 발생 시 처리할 코드
}

예제 1 - 0으로 나누기

try
{
    int a = 10;
    int b = 0;
    int result = a / b;  // 여기서 예외 발생
}
catch (DivideByZeroException e)
{
    Console.WriteLine("0으로 나누면 안 됩니다!");
}
catch (Exception e)
{
    Console.WriteLine("기타 예외 발생");
}

흐름 설명

  1. a / b에서 DivideByZeroException 발생
  2. 첫 번째 catch에서 해당 예외를 받아 처리
  3. 아래 catch (Exception)은 실행되지 않음 (이미 처리됐기 때문)

📌 Exception 클래스는 모든 예외의 부모

catch (Exception e)
{
    // 모든 예외를 처리할 수 있음
}
  • Exception은 C#의 모든 예외 클래스의 부모 클래스입니다.
  • 따라서 어떤 예외가 발생해도 catch (Exception)이 모두 잡을 수 있습니다.
  • 단, 구체적인 예외보다 먼저 쓰면 안 됩니다 (컴파일 에러 발생).

❌ 잘못된 예

try { ... }
catch (Exception e) { }  // 모든 예외 처리
catch (DivideByZeroException e) { }  // 여기까지 안 옴

📌 finally - 반드시 실행되는 블록

try
{
    // 정상 코드 or 예외 발생 코드
}
catch (Exception e)
{
    // 예외 발생 시 실행
}
finally
{
    // 무조건 실행 (예외 발생 여부와 무관)
}

사용 예 - DB 연결 해제

SqlConnection conn = null;
try
{
    conn = new SqlConnection("...");
    conn.Open();
    // DB 작업
}
catch (Exception e)
{
    Console.WriteLine("DB 작업 중 예외 발생");
}
finally
{
    conn?.Close();  // 무조건 실행되어 연결 해제
}

📌 사용자 정의 예외 - Custom Exception

class TestException : Exception { }

사용자 정의 예외 던지기

throw new TestException();

📌 throw - 예외 직접 던지기

예제 2 - 사용자 정의 예외 던지기

class TestException : Exception { }

static void TestFunc()
{
    throw new TestException();
}

static void Main(string[] args)
{
    try
    {
        TestFunc();
    }
    catch (TestException e)
    {
        Console.WriteLine("TestException 발생!");
    }
}

📌 강의 예제 완전 분석

전체 코드

using System.ComponentModel;
using System.Numerics;
using System.Threading;
using System.Collections.Generic;

namespace CSharp
{
    class Program
    {
        class TestException : Exception { }

        static void TestFunc()
        {
            throw new TestException();
        }

        static void Main(string[] args)
        {
            try
            {
                TestFunc();
                throw new TestException();
            }
            catch (DivideByZeroException)
            {
                // 0으로 나눌 때 처리
            }
            catch (Exception ex)
            {
                // 기타 예외 처리
            }
            finally
            {
                // 무조건 실행되는 코드 (예: 로그 기록, 리소스 해제)
            }
        }
    }
}

한 줄씩 분석

코드설명
class TestException : Exception사용자 정의 예외 클래스 선언
static void TestFunc()예외 발생시키는 함수
throw new TestException()직접 예외 던짐
try예외 발생 가능 코드 실행
TestFunc()예외 발생 코드 호출
throw new TestException()또 다른 예외 발생
catch (DivideByZeroException)0 나누기 예외 처리
catch (Exception ex)나머지 모든 예외 처리
finally무조건 실행되는 블록

📌 흐름 정리

  1. TestFunc() 실행 → TestException 발생 → catch (Exception)로 이동
  2. 이후 throw new TestException() 실행 → 또 TestException 발생 → 다시 catch (Exception)로 이동
  3. 마지막으로 finally 블록 실행됨

📌 정리 표

키워드역할
try예외 발생 가능 코드 영역
catch예외 잡아서 처리하는 영역
finally무조건 실행되는 영역
throw예외 강제로 발생
Exception모든 예외의 부모 클래스
사용자 정의 예외개발자가 직접 만드는 예외 클래스

📌 실제 현업 사용 예 - 네트워크 예외 처리

try
{
    // 서버 연결 및 데이터 전송
}
catch (SocketException ex)
{
    Console.WriteLine($"네트워크 오류 발생: {ex.Message}");
}
finally
{
    // 소켓 정리 (무조건 실행)
}

profile
李家네_공부방

0개의 댓글