GSI

'Exception Handling'에 해당되는 글 1건

  1. 2007.10.19 Exception (예외) 처리

Exception (예외) 처리

C# 2007. 10. 19. 15:17 |

Exception

C# 에서의 에러 처리는 예외를 사용하여 손쉽게 수행된다. 예외 처리는 에러가 발생할 만한 구문들을 try 블록 안에 넣고, catch 블록에서 에러를 잡는 것이다.

try {
   // 에러가 발생할 만한 구문
}
catch (Exception e) {
   // 에러가 발생했을 때 처리하는 구문
}
finally {
   // 언제나 실행되는 구문
}


이러한 접근 방식은 파일을 다루는 문장에서 에러를 검사하거나, 배열의 범위를 벗어나는 인덱스 문장의 에러를 잡아내는 등의 여러가지 에러 상황을 검사하는 곳에서 사용된다. 이 방법이 동작하는 방식은 일단 try 블록이 실행되고, 여기서 에러가 발생하지 않으면, finally 블록이 실행된다. 만약 try 구문내에서 에러가 발생하면 제어가 catch 구문으로 넘어간 후, finally 블록을 실행하고 밖으로 빠져나가게 된다.

다음 예제는 예외를 검사하는 것을 보여준다. ArrayList 에서 범위를 벗어난 값에 접귾려고 했기 때문에, 에러가 발생할 것이다.

try {
   // 너무 많이 접근한다는 점에 주의 하자
   for(int i = 0; i <= arl.Count; i++)
      console.WriteList(arl[i]);
}
catch (Exception e) {
   Console.WriteList(e.Message);
}


이 코드는 에러 메시지를 출력하고, 프로그램에서 에러가 발생한 부분을 보여주고 계속 실행된다.

0123456789 인덱스가 범위를 벗어났습니다.
인덱스는 음수가 아니어야 하며 컬렉션의 크기보다 작아야 합니다.
매개 변수 이름 : index
   at System.Collections.Arraylist.get_Item(int32 index)
   at arr.Form1..ctor() in form1.cs:line 58

만약 예외를 잡아내지 못하면, 실행중에 시스템으로부터 에러 메시지를 받고, 프로그램은 계속 진행되지 않고 종료될 것이다.

C# 예외 클래스들..

  • AccessException : 클래스의 메서드 또는 필드에 접근할 때의 에러
  • ArgumentException : 메서드의 인수가 유효하지 않음
  • ArgumentNullException : 인수가 null임
  • ArthmeticException : 오버플로우 또는 언더플로우
  • DivideByZeroException : 0으로 나누기
  • IndexOutOfRangeException :배열의 범위를 넘어선 인덱스
  • FileNotFoundException : 파일을 찾을수 없음
  • EndOfStreamException : 입력 스트림의 범위를 넘어선 접근
  • DirectoryNotFoundException : 디렉터리를 찾을 수 없음
  • NullReferenceException : 객체 변수가 실제값으로 초기화 되지 않음

다중 예외
여러 개의 catch 블록에서 여러 개의 예외를 받아 서로 다르게 처리할 수 있다.

try {
   for(int i = 0; i <= arl.Count; i++) {
      int k = (int)(float)arl[i];
      Console.Write(i + "" + k/i);
   }
   catch (DivideByZeroException e) {
      printZErr(e);
   }
   catch (IndexOutOfRangeException e) {
      printOErr(e);
   }
   catch(Exception e) {
      printErr(e);
   }
}


예외 던지기
예외가 발생했다고 해서 바로 그곳에서 처리해야할 필요는 없다. throw 구문을 사용하여 호출한 프로그램에게 예외를 전달할 수 있다. 이것은 호출한 프로그램에서 예외가 발행하게 하는 것이다.

try {
   // 구문
}
catch (Exception e) {
   throw(e);      // 호출한 프로그램에게 전달한다.
}

C#은 자바의 throw 구문을 지원하지 않는다는 것에 주의 하자. 자바에서는 메서드가 예뢰를 던질 것이라는 것을 선언할 수 있으므로, 프로그램에서는 반드시 예외 처리 핸들러를 제공해야 한다.

Posted by gsi
: