반응형
✅ 예외 처리(Exception Handling) - 프로그램을 안전하게 지키는 방패
C#을 비롯한 대부분의 언어에서는 **예외(Exception)**라는 개념이 있다.
예외는 프로그램 실행 중에 발생하는 예상하지 못한 상황을 의미하고,
이걸 제대로 처리하지 않으면 프로그램이 갑자기 종료될 수 있다.
그렇기 때문에 예외는 단순한 에러가 아니라,
예외 상황에 대응하는 코드를 반드시 작성해줘야 한다.
📌 예외란 무엇인가요?
예외는 다음과 같은 상황에서 발생할 수 있다:
- 0으로 나누기
- 존재하지 않는 파일 열기
- 배열 인덱스 초과 접근
- null 객체 사용 등등
이런 예외가 발생하면 C#에서는 프로그램을 중단하고 예외 메시지를 출력한다.
하지만 우리가 try-catch 문을 사용하면 예외를 잡아서 직접 처리할 수 있다.
🔧 기본 구조: try-catch-finally
try
{
// 예외가 발생할 수 있는 코드
}
catch (Exception ex)
{
// 예외 발생 시 실행할 코드
}
finally
{
// 예외 발생 여부와 관계없이 무조건 실행됨
}
🎯 예제: 0으로 나누기
try
{
int result = 10 / 0;
Console.WriteLine("결과: " + result);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("0으로 나눌 수 없습니다.");
}
finally
{
Console.WriteLine("finally 블록이 실행됩니다.");
}
- try: 문제가 생길 수 있는 코드 작성
- catch: 문제가 생기면 이곳에서 처리
- finally: 문제가 생겼든 안 생겼든 무조건 실행됨
🧱 여러 개의 catch 사용하기
try
{
// 여러 예외가 발생할 수 있는 코드
}
catch (FormatException)
{
Console.WriteLine("입력 형식이 잘못되었습니다.");
}
catch (NullReferenceException)
{
Console.WriteLine("객체가 null입니다.");
}
catch (Exception ex)
{
Console.WriteLine("예외 발생: " + ex.Message);
}
- catch는 위에서부터 차례로 실행되며, 가장 먼저 매칭되는 예외 블록이 실행된다.
- 보다 구체적인 예외 타입부터 먼저 작성하는 게 중요하다!
🧑💻 사용자 정의 예외
예외는 기본 제공만 쓰는 게 아니라 직접 정의해서 만들 수도 있다.
public class NegativeNumberException : Exception
{
public NegativeNumberException(string message) : base(message) { }
}
try
{
int num = -5;
if (num < 0)
throw new NegativeNumberException("음수는 허용되지 않습니다.");
}
catch (NegativeNumberException ex)
{
Console.WriteLine(ex.Message);
}
- throw 키워드를 사용하면 의도적으로 예외를 발생시킬 수 있다.
- Exception 클래스를 상속받아 새로운 예외를 정의할 수 있다.
🔄 finally 블록 언제 쓰나요?
- 파일, 네트워크, DB 연결 등은 예외 발생 여부와 상관없이 정리 작업이 필요하다.
- 이럴 때 finally를 사용하면 무조건 실행되므로 리소스 해제에 좋다!
FileStream file = null;
try
{
file = File.Open("data.txt", FileMode.Open);
}
catch (IOException ex)
{
Console.WriteLine("파일 열기에 실패했습니다.");
}
finally
{
if (file != null)
file.Close(); // 무조건 닫힘!
}
🚧 예외 처리 시 주의사항
주의할 점 | 설명 |
너무 포괄적인 catch 사용 ❌ | catch (Exception)만 쓰면 디버깅이 어려워진다 |
가능한 구체적인 예외 먼저 ✅ | DivideByZeroException, FormatException 등 먼저 작성 |
로직은 try 밖에, 예외만 try 안에 | 예외가 발생할 수 있는 코드만 try에 넣는 게 좋다 |
finally는 리소스 해제에 활용 | Close, Dispose 같은 정리 작업은 finally 안에서 |
반응형
'C#' 카테고리의 다른 글
C# - 델리게이트와 람다, 함수도 변수처럼! + LINQ (5) | 2025.07.09 |
---|---|
C# - 값형(Value Type)과 참조형(Reference Type) 그리고 박싱(Boxing) & 언박싱(Unboxing) (0) | 2025.07.09 |
C# - 인터페이스와 열거형 (Interface, enum) (2) | 2025.07.09 |
C# - 콘솔 블랙잭 게임 & 사용되는 예제들 (3) | 2025.07.09 |
C# - C#으로 간단한 아이템 매니저 구현하기 - List와 LINQ로 컬렉션 관리 연습 (0) | 2025.07.08 |