적절한 예외 처리는 프로그램의 안정성을 높이고 디버깅을 용이하게 한다.
| 예외 타입 | 설명 |
|---|---|
| DivideByZeroException | 0으로 나누려 할 때 발생 |
| NullReferenceException | null 객체에 접근하려고 할 때 발생 |
| IndexOutOfRangeException | 배열 인덱스가 범위를 벗어났을 때 발생 |
| FormatException | 형식이 잘못된 문자열을 숫자로 바꿀 때 발생 |
| InvalidOperationException | 객체의 상태가 작업을 수행하기에 부적절할 때 발생 |
try
{
// 예외가 발생할 수 있는 코드
}
catch (ExceptionType e)
{
// 예외 발생 시 실행할 코드
}
finally
{
// 예외 발생 여부와 관계없이 항상 실행되는 코드 (선택적)
}
try
{
int num1 = 10;
int num2 = 0;
int result = num1 / num2; // 여기서 예외 발생
}
catch (DivideByZeroException ex)
{
Console.WriteLine("0으로 나눌 수 없습니다!");
}
finally
{
Console.WriteLine("프로그램 종료");
}
try
{
Console.Write("숫자를 입력하세요: ");
string input = Console.ReadLine();
int num = int.Parse(input); // FormatException 가능성
int result = 100 / num; // DivideByZeroException 가능성
Console.WriteLine($"결과: {result}");
}
catch (FormatException fe)
{
Console.WriteLine("숫자 형식이 잘못되었습니다.");
}
catch (DivideByZeroException de)
{
Console.WriteLine("0으로 나눌 수 없습니다.");
}
catch (Exception e) // 모든 예외의 최상위 부모
{
Console.WriteLine($"알 수 없는 오류 발생: {e.Message}");
}
finally
{
Console.WriteLine("예외 처리를 마쳤습니다.");
}
try - 예외 처리가 발생할 수 있는 코드 작성
catch - 예외 처리
finally - 예외 발생 여부와 상관없이 항상 실행catch 블록은 구체적인 예외 타입부터 위에 작성
-> Exception 클래스를 상속받아 새로운 예외 클래스 정의
기본 구조
public class MyCustomException : Exception
{
public MyCustomException(string message) : base(message) { }
}
throw new MyCustomException("CustomException");
사용 예시
// 사용자 정의 예외 클래스
public class NotEnoughManaException : Exception
{
public NotEnoughManaException() : base("마나가 부족합니다.") { }
public NotEnoughManaException(string message) : base(message) { }
}
public class Mage
{
public int Mp { get; set; }
public Mage(int mp)
{
Mp = mp;
}
public void CastSpell(int mpCost)
{
if (Mp < mpCost)
{
throw new NotEnoughManaException(); // 사용자 정의 예외 발생
}
Mp -= mpCost;
Console.WriteLine("마법 시전!");
}
}
// 실제 사용
try
{
Mage mage = new Mage(5);
mage.CastSpell(10);
}
catch (NotEnoughManaException ex)
{
Console.WriteLine($"사용자 정의 예외 발생: {ex.Message}");
}
상황에 맞는 예외명을 통해 버그 상황을 명확하게 전달할 수 있다.
적절한 위치의 예외처리로 어디서 에러가 발생했는지 확인하고 수정해 유지보수를 쉽게 하자
-> 예외 처리를 남발하게 되면 가독성도 떨어지고, 성능도 저하 될 수 있다.