11.3 파생 관계의 예외 잡기
C#의 예외 처리구문에서는 하나의 try 블록 뒤에 여러 개의 catch 블록을 지정할 수 있습니다. 그리고 catch 블록에서는 앞에 배치한 곳에서 예외를 받아서 처리하면 뒤에 있는 catch 블록은 수행하지 않습니다.
예를 들어 try 블록 뒤에 Exception 개체를 받아 처리하는 catch 블록과 SystemException 개체를 받아 처리하는 catch블록을 지정했다고 가정합시다. 기반 형식 변수로 파생 형식 개체를 참조할 수 있기 때문에 어떠한 예외가 발생해도 앞에 배치한 catch 블록에서 예외를 받아 처리하고 뒤에 배치한 catch 블록은 동작하지 않습니다. 따라서 여러 개의 catch 블록을 배치할 때 파생 형식을 처리하는 catch 블록부터 배치해야 합니다.
using System;
namespace 여러_개의_catch블록_지정
{
ApplicationException에서 파생한 간단한 예외 클래스를 정의합시다.
class MyException : ApplicationException
{
public MyException(string msg)
: base(msg)
{
}
}
입력 인자에 따라 다른 종류의 예외를 던지는 부분도 정의합니다.
class Demo
{
internal static void Trace(int a)
{
switch (a)
{
case 1: throw new Exception("Exception 예외");
case 2: throw new SystemException("SystemException 예외");
case 3: throw new ApplicationException("Application 예외");
default: throw new MyException("MyException 예외");
}
}
}
정수를 입력 받아 테스트 해 봅시다. 여기에서는 파생 형식의 예외를 잡아 처리하는 catch 블록부터 배치하였습니다.
class Program
{
static void Main(string[] args)
{
int num = 0;
try
{
Console.WriteLine("정수 입력");
if (int.TryParse(Console.ReadLine(), out num))
{
Demo.Trace(num);
}
}
catch (MyException e)
{
Console.WriteLine(e);
}
catch (ApplicationException e)
{
Console.WriteLine(e);
}
catch (SystemException e)
{
Console.WriteLine(e);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}
테스트를 해 보면 전달하는 값에 따라 수행하는 catch 블록이 다름을 알 수 있습니다. catch 블록의 순서를 변경한 후에 다시 테스트 해 보세요.
관련 게시글
'언어 자료구조 알고리즘 > Escort C#' 카테고리의 다른 글
[C#] 12. 직렬화와 리플렉션 - 리플렉션 (0) | 2016.05.16 |
---|---|
[C#] 12. 직렬화와 리플렉션 - 사용자 지정 직렬화 (0) | 2016.05.16 |
[C#] 12. 직렬화와 리플렉션 - 선별적 직렬화 (0) | 2016.05.16 |
[C#] 12. 직렬화 및 리플렉션 - 직렬화 (0) | 2016.05.16 |
[C#] 11. 예외 처리 - 예외 클래스 (0) | 2016.05.16 |
[C#] 11. 예외 처리 - 예외처리 구문 (0) | 2016.05.16 |
[C#] 10. .NET 어셈블리 - 모듈 작성 (0) | 2016.05.03 |
[C#] 10. .NET 어셈블리 - XML 문서 파일 (0) | 2016.05.03 |
[C#] 10. .NET 어셈블리 - 공용 어셈블리 (0) | 2016.05.03 |
[C#] 10. .NET 어셈블리 - 전용 어셈블리 (0) | 2016.05.03 |