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# 예외 처리 강의 내용을 기반으로 작성하신 예제 코드, 강의록, 주석 설명을 한 줄 한 줄 완벽 분석하고,
앞으로도 학습 복습에 도움이 되도록 블로그 포스팅 스타일로 정리해드리겠습니다.
아래는 블로그용 완성본입니다.
프로그램 실행 중 비정상적인 상황이 발생하면, 프로그램은 멈출 수밖에 없습니다.
이런 비정상적인 상황을 "예외"라고 부르며, 이걸 처리하는 과정이 바로 예외 처리(Exception Handling)입니다.
게임에서는 사실 예외 처리를 적극적으로 하지 않는 편입니다.
크래시 로그를 보고, 원인을 분석해서 코드 자체를 수정하는 경우가 많습니다.
그러나, 네트워크 오류처럼 반드시 잡아야 하는 예외도 있습니다.
따라서 예외 처리 문법은 반드시 알아야 합니다.
| 상황 | 설명 |
|---|---|
| 0으로 나누기 | DivideByZeroException 발생 |
| 잘못된 메모리 참조 | NullReferenceException 발생 |
| 오버플로우 | OverflowException 발생 |
try
{
// 예외가 발생할 가능성이 있는 코드
}
catch (예외타입 변수명)
{
// 해당 예외 발생 시 처리할 코드
}
try
{
int a = 10;
int b = 0;
int result = a / b; // 여기서 예외 발생
}
catch (DivideByZeroException e)
{
Console.WriteLine("0으로 나누면 안 됩니다!");
}
catch (Exception e)
{
Console.WriteLine("기타 예외 발생");
}
a / b에서 DivideByZeroException 발생catch에서 해당 예외를 받아 처리catch (Exception)은 실행되지 않음 (이미 처리됐기 때문)catch (Exception e)
{
// 모든 예외를 처리할 수 있음
}
Exception은 C#의 모든 예외 클래스의 부모 클래스입니다.catch (Exception)이 모두 잡을 수 있습니다.❌ 잘못된 예
try { ... }
catch (Exception e) { } // 모든 예외 처리
catch (DivideByZeroException e) { } // 여기까지 안 옴
try
{
// 정상 코드 or 예외 발생 코드
}
catch (Exception e)
{
// 예외 발생 시 실행
}
finally
{
// 무조건 실행 (예외 발생 여부와 무관)
}
SqlConnection conn = null;
try
{
conn = new SqlConnection("...");
conn.Open();
// DB 작업
}
catch (Exception e)
{
Console.WriteLine("DB 작업 중 예외 발생");
}
finally
{
conn?.Close(); // 무조건 실행되어 연결 해제
}
class TestException : Exception { }
throw new TestException();
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 | 무조건 실행되는 블록 |
TestFunc() 실행 → TestException 발생 → catch (Exception)로 이동throw new TestException() 실행 → 또 TestException 발생 → 다시 catch (Exception)로 이동| 키워드 | 역할 |
|---|---|
try | 예외 발생 가능 코드 영역 |
catch | 예외 잡아서 처리하는 영역 |
finally | 무조건 실행되는 영역 |
throw | 예외 강제로 발생 |
Exception | 모든 예외의 부모 클래스 |
| 사용자 정의 예외 | 개발자가 직접 만드는 예외 클래스 |
try
{
// 서버 연결 및 데이터 전송
}
catch (SocketException ex)
{
Console.WriteLine($"네트워크 오류 발생: {ex.Message}");
}
finally
{
// 소켓 정리 (무조건 실행)
}