이번 포스팅은 C#에서 다중 catch문을 구현하는 방법을 소개합니다.
다중 catch문 구현 방법
C#에서는 try문에 대해 여러 catch문을 작성할 수 있습니다. 예외는 동시에 발생하지 않으므로 여러 catch문을 작성하면 예외를 처리하는 하나의 catch문만 실행되고 나머지 catch문은 실행되지 않습니다.
다음 예제는 try문에 대해 여러 catch문을 구현하였습니다.
첫 번째 catch문은 DivideByZeroException 클래스를 매개변수로 사용하고 두 번째 catch문은 FormatException 클래스를 매개변수로 사용합니다.
class Program
{
static void Main(string[] args)
{
int a, b, c;
try
{
a = int.Parse(Console.ReadLine());
b = int.Parse(Console.ReadLine());
c = a / b;
Console.WriteLine("C VALUE = " + c);
}
catch (DivideByZeroException ex1) // 0으로 나누는 경우
{
Console.WriteLine("0으로 나눌 수 없습니다.");
}
catch (FormatException ex2) // 문자열을 입력하는 경우
{
Console.WriteLine("문자열을 숫자로 변환할 수 없습니다.");
}
}
}
실행 결과 1. 100과 0 입력
100
0
0으로 나눌 수 없습니다.
실행 결과 2. 100과 hi 입력
100
hi
문자열을 숫자로 변환할 수 없습니다.
다중 catch문 주의사항
다중 catch문을 구현하는 경우 다음 예제처럼 catch문을 작성할 수 없습니다.
class Program
{
static void Main(string[] args)
{
int a, b, c;
try
{
a = int.Parse(Console.ReadLine());
b = int.Parse(Console.ReadLine());
c = a / b;
Console.WriteLine("C VALUE = " + c);
}
catch (Exception ex)
{
Console.WriteLine("모든 예외를 캐치합니다.");
}
catch (DivideByZeroException ex1) // 0으로 나누는 경우
{
Console.WriteLine("0으로 나눌 수 없습니다.");
}
catch (FormatException ex2) // 문자열을 입력하는 경우
{
Console.WriteLine("문자열을 숫자로 변환할 수 없습니다.");
}
}
}
에러 내용
Exception 클래스는 최상위 예외 클래스이므로 모든 예외를 캐치합니다. 따라서, Exception 클래스를 사용하는 경우 다중 catch문을 구현할 수 없으며 컴파일 에러가 발생합니다.
단일 catch문에서 예외 처리
최상위 예외 클래스인 Exception 클래스를 사용하여 단일 catch문에서 예외 처리를 분리할 수 있습니다.
다음 예제는 단일 catch문에서 if-else문을 사용하여 예외 처리를 분리합니다.
class Program
{
static void Main(string[] args)
{
int a, b, c;
try
{
a = int.Parse(Console.ReadLine());
b = int.Parse(Console.ReadLine());
c = a / b;
Console.WriteLine("C VALUE = " + c);
}
catch (Exception ex)
{
if(ex is DivideByZeroException)
{
Console.WriteLine("0으로 나눌 수 없습니다.");
} else if(ex is FormatException)
{
Console.WriteLine("문자열을 숫자로 변환할 수 없습니다.");
} else
{
Console.WriteLine("모든 예외를 캐치합니다.");
}
}
}
}
실행 결과 1. 100과 0 입력
100
0
0으로 나눌 수 없습니다.
실행 결과 2. 100과 hi 입력
100
hi
문자열을 숫자로 변환할 수 없습니다.
다중 catch문 vs 단일 catch문
예외가 발생하면 다중 catch문으로 처리하는 것이 나을까요? 단일 catch문으로 처리하는 것이 나을까요?
예외 클래스 상관없이 비정상적인 종료를 중지하고 싶은 경우 단일 catch문이 나으며, 예외를 세부적으로 처리하고 싶은 경우 다중 catch문이 좋습니다.
참고로 소스코드 보안 취약점에서 단일 catch문은 에러를 불충분하게 처리한 것으로 간주합니다. 따라서, 단일 catch문에서 예외 처리를 분리하는 것보다 다중 catch문 사용하는 것을 권장합니다.
정리
- 한 개의 try문에 대해 여러 catch문을 작성할 수 있습니다.
- Exception 클래스를 사용하는 경우 단일 catch문으로 예외를 처리해야 합니다.
- 소스코드 보안 취약점에서 단일 catch문은 에러를 불충분하게 처리한 것으로 간주합니다. 따라서 다중 catch문을 권장합니다.
'C#' 카테고리의 다른 글
[C#]throw문, 사용자 정의 예외 (0) | 2022.06.26 |
---|---|
[C#]finally 키워드, finally문 (0) | 2022.06.26 |
[C#]예외 처리(Exception Handling) (0) | 2022.06.26 |
[C#]타입 변환 및 타입 캐스팅(Type Conversion and Type Casting) (0) | 2022.06.21 |
[C#]스레드 Join 메서드(Join Method of Thread) (0) | 2022.06.15 |
댓글