달력

12

« 2024/12 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2010. 4. 1. 15:01

'10.03.22 story JAVA이야기2010. 4. 1. 15:01

예외

사용해야 할 상황

IllegalArgumentException

null이 아닌 매개 변수 값이 부적합할 때

IllegalStateException

객체가 메소드 호출이 가능한 상태가 아닐때

NullpointerException

매개 변수 값이 null일 때

IndexOutOfBoundsException

인덱스 매개 변수 값이 범위를 벗어날 때

ConcurrentModificationException

동시적인 수정이 금지된 객체가 변경되었을 때

UnsupportedOperationException

해당 객체에서 메소드를 지원하지 않을 때

 

하위 계층의 예외 처리를 신중하게 하자

어떤 메소드가 자신이 수행하는 작업과 뚜렷한 관계가 없는 예외를 발생시킨다면 혼란스러울 것이다. 이런 일은 저수준의 추상체에서 발생한 예외를 메소드 전파할 때 종종 생긴다. 이것은 혼란스럽기도 하지만, 상위 계층의 API에서 세부적인 구현 내역이 노출된다. 만일 상위 계층의 구현 내역이 차후 배포판에서 변경되면, 거기에서 발생시키는 예외도 변경될 것이고, 그 결과로 기존 클라이언트 프로그램에도 영향을 줄 것이다. 이런 문제를 방지하려면, 상위 계층에서 하위 계층의 예외를 반드시 catch해야 한다. 그리고 그 예외대신에 상위 계층의 추상체가 알 수 있는 예외로 바꿔 던져야 한다. 이와 같은 이디엄을 예외 변환이라고 한다.

//예외 변환

try{

//하위 계층의 추상체를 사용하여 작업하는 코드(DB작업등.)

....

}catch(LowerLevelException ex){

throw new HigherLevelException(...):

}

 

다음은 List인터페이스의 골격 구현이라고 할 수 있는 Abstract-SequentialList의 예외 변환 코드이다. List<E> 인터페이스의 get메소드를 올바르게 구현하기 위해, API문서의 그 메소드 명세에 나와 있는대로 예외 변환을 한 것이다.

 

예외를 유발시킨 근원인 저수준 예외가 고수준 예외로 전달되는 것으로써, 이 때 고수준 예외에서는 저수준 예외를 가져오는 접근자 메소드를 제공한다.

 

//예외 연쇄

try{

...

//저수준의 추상체를 사용하여 작업을 하는 코드

}catch(LowerLevelException cause){

throw new HigherLevelException(cause)

}

 

 

//예외 연쇄를 사용하는 고수준 예외 클래스

class HigherLevelException extends Exception{

HigherLevelException(Throwable cause){

super(cause);

}

}

 

하위 계층(저수준)에서 발생한 예외를 분별없이 전파하는 것보다는 예외 변환을 사용하는 것이 좋지만, 예외 변환 역시 남용해서는 안된다.

 

요약하면, 하위 계층에서 발생한 예외를 막거나 그 자체에서 처리할 수 없다면, 예외 변환 방법을 사용하자. 예외 연쇄는 모든 경우에서 가장 좋은 방법을 제공한다. 예외 연쇄를 이용하면, 하위 계층의 예외가 발생했을 때 거기에 적합한 상위 계층 예외를 던질 수 있으며, 문제의 근원이 되는 하위 계층 예외 정보를 기록하여 시스템 장애 분석에 사용할 수 있다.

 

메소드가 던지는 모든 예외를 문서화하자

메소드를 올바르게 사용하려면 그 메소드의 명세가 문서화되어야 하며, 그 메소드가 던지는 예외 또한 상세히 기술되어야 한다.

Javadoc의 @throws 태그를 사용해서 항상 checked 예외는 별도로 선언하고, 각 예외가 발생하는 상황을 정확하게 문서화하자.

Javadoc의 @throws 태그를 사용하여 메소드가 던질 수 있는 unckecked예외를 문서화하자. 그러나 메소드 선언부의 throws 키워드에는 unckecked예외를 넣지 말자.

(주석에는 unckecked 예외를 적고, 메소드 선언 시에는 unckecked메소드를 던지지 않는다

 

만일 같은 클래스의 여러 메소드에서 동일한 이유로 어떤 한 가지 예외를 던진다. 그 예외를 각 메소드에 개별적으로 문서화하는 것보다는 클래스의 문서화 주석에 그 예외의 설명을 추가하는 것이 좋다.

'JAVA이야기' 카테고리의 다른 글

'10.03.24 story  (0) 2010.04.01
'10.03.23 story  (0) 2010.04.01
'10.03.21 story  (0) 2010.04.01
'10.03.19 story  (0) 2010.04.01
'10.03.17 story  (0) 2010.04.01
:
Posted by НooпeУ


Code Start Code End