시소당
5. 메소드
5.1. 인자의 유효성을 검사하라
유효성 검사를 통해 인자가 유효하지 않을 때 적절한 예외를 발생시키면, 빠르고 깔끔하게 메소드를 종료할 수 있다.
5.2. 메소드 시그니처를 신중하게 설계하라
1. 메소드 이름을 신중하게 결정하라. 이름은 항상 표준 명명 규칙을 따라야 한다.
2. 편리한 메소드를 제공하기 위해 너무 애쓰지 마라.
3. 인자를 너무 많이 받지 마라. 현실적으로 인자 개수가 세 개를 넘으면 문제가 있다.
5.3. null이 아닌 길이가 0인 배열을 리턴하라
5.4. 외부에 제공하는 API의 모든 구성요소에 대해 문서화 주석을 달아라
API를 문서화하려면, 외부에 제공하는 모든 클래스, 인터페이스, 생성자, 메소드, 필드에 문서화 주석을 달아야 한다.
6. 예외처리
6.1. 예외는 예외상황에서만 써야 한다
예외 기반의 구현패턴은 코드의 목적을 애매하게 만들고 성능도 떨어뜨린다.
6.2. 처리해야 하는 예외와 런타임 예외를 구분해서 던져라
1. 처리해야 하는 예외
호출자가 예외상황을 복구할 수 있다고 기대할 수 있을 때 던진다.
2. 처리하지 않는 예외
런타임 예외와 에러가 있다. 이 둘의 행동 방식은 똑같다. 이것들을 잡을 필요도 없고
특별한 경우가 아니라면 잡아서도 안 된다. 이는 복구할 수 없는 상황이기 때문에 더
이상 프로그램을 실행하는 것은 위험할 수도 있다.
6.3. 표준 예외를 써라
예외
용도
IllegalArgumentException
인자 값이 적절하지 못할 때
IllegalStateException
호출을 받은 객체상태가 적절하지 못할 때
NullPointerException
null을 금지한 인자 값이 null일 때
IndexOutOfBoundsException
인덱스 값이 범위를 벗어났을 때
ConcurrentModificationException
동시 수정을 금지한 객체를 동시에 수정할 때
UnsupportedOperationException
객체가 메소드를 지원하지 않을 때
6.4. 예외처리 전략
1. 비즈니스 로직을 수행하는 중 발생하는 비즈니스적인 Exception을 제외하고는 모든 Exception을 Unchecked Exception으로 처리한다.
2. Checked Exception 중 고객이 인지해야 하는 Exception은 메시징 처리를 통해 display 해주며, 시스템 관리자에게 메일로도 통보해 줄 수 있도록 해준다. (에러 메시지를 처리하는 페이지를 따로 두어 처리한다.)
3. Unchecked Exception이 발생하는 경우 Exception 내용을 시스템 관리자에게 메일로 통보해준다.
4. database 다운과 같이 프로그램적으로 해결하기 힘든 에러가 발생할 경우에는 Unchecked Exception을 사용한다.
5. Unchecked Exception 이나 Checked Exception 중 처리되지 않는 Exception은 servlet container에서 제공하는 에러 처리 기능을 활용하여 처리토록 한다. 예를 들어, 404, 500에러 발생시 특정페이지로 이동토록 설정한다.
public String socketGet(String host, int port, String uri, String argv) {
StringBuffer result = new StringBuffer();
try {
URL url = new URL("http", host, port, uri + argv);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
try {
String line = "";
while (line != null) {
line = reader.readLine();
if (line != null) result.append(line);
}
} finally {
reader.close();
}
return result.toString();
} catch (Exception e) {
System.err.println(e.getMessage());
return null;
}
}