문득, 그리고 분명, 헷갈려 하는 사람이 있으리라 보입니다
초 간단한 퀴즈 입니다
아래 코드에서,
Console.WriteLine("이 라인이 실행될까요?"); <--- 이 부분이 실행이 될까요, 실행되지 않을까요?
단번에 맞춰야 합니다
코드는 0으로 나누기 예외가 발생하도록 했습니다
static void Main(string[] args)
{
try
{
int i = 0; int j = 1;
int x = j / i;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw ex;
}
finally
{
Console.WriteLine("finally");
}
Console.WriteLine("이 라인이 실행될까요?");
}
음..
단번에 맞추셨나요? 너무 무시(?)하는 문제인가요 ^^;
finally 는 예외가 발생하던 안하던 늘 실행되는 블럭이죠
그리고 try, catch, finally 블럭을 벗어난 하단의 코드는 실행되지 않습니다
이유는, catch 블럭의 throw 때문입니다. catch 블럭의 throw 는 예외를 재 발생 시킵니다
만일 throw 가 없었다면, 이 코드는 실행됩니다
예외 처리를 나름대로 멋지게 할려다가,
간혹 의도하지 않은 결과를 발생시킬 수도 있습니다. 특히 처음 개발을 시작하는 분들에게 많이 보입니다
물론 이 문제가 예외 처리 기법과는 조금 무관하기는 하지만, 한번 쯤 생각해 보세요
그리고 닷넷의 구조적 예외처리 기법에 대해 공부하세요
언어에서 지원하는 예외처리 기법이 당연한 것 처럼 받아 들이지만,
구조적 예외 처리 및 예외 객체를 사용하는 것은 이전 프로그래밍 환경에 비해 상당히 개선되고 유용한 기법입니다
예로,
MS SQL 2000 까지는 try, catch 블럭이 지원되지 않았죠
그래서 트랜잭션 내에서 예외 발생을 잡기 위해서는 SQL 로직 사이사이 @@ERROR 을 잡아 채야 했죠
물론 2005에서는 지원합니다