제공된 코드가있는 상황을 고려하십시오.
public void delete() throws IOException, SQLException { // Non-Compliant
/* ... */
}
여기서의 위험은 호출하기 위해 작성한 코드 delete()
가 다음과 같습니다.
try {
foo.delete()
} catch (Exception e) {
/* ... */
}
이것도 나쁘다. 그리고 기본 Exception 클래스를 잡는 플래그를 지정하는 또 다른 규칙이 있습니다.
핵심은 다른 곳에서 잘못된 코드를 작성하도록하는 코드를 작성하지 않는 것입니다.
당신이 겪는 규칙은 다소 일반적인 규칙입니다. Checkstyle 은 디자인 규칙에 다음과 같이 있습니다.
ThrowsCount
명령문을 지정된 개수 (기본적으로 1)로 제한합니다.
이론적 근거 : 예외는 메소드 인터페이스의 일부이다. 너무 많은 다른 근본 예외를 처리하는 메소드를 선언하면 예외 처리가 번거로워지고 catch (Exception ex)와 같은 코드 작성과 같은 프로그래밍 방식이 잘못됩니다. 이 검사를 통해 개발자는 예외를 계층 구조에 넣어 가장 간단한 경우 호출자가 한 가지 유형의 예외 만 검사해야하지만 필요한 경우 하위 클래스를 구체적으로 잡을 수 있습니다.
이것은 문제와 문제가 무엇인지, 왜하지 말아야 하는지를 정확하게 설명합니다. 많은 정적 분석 도구가 식별하고 플래그를 지정하는 것이 널리 인정되는 표준입니다.
당신이 반면 수 있습니다 언어 설계에 따라 작업을 수행하고있을 수 는 옳은 일 때 배, 당신이보고 즉시 가야한다 무언가이다 "음, 내가 왜이 일을하고있다?" 모든 사람이 결코 징계 할 수 없을 정도로 훈련 된 내부 코드에는 허용 될 수 catch (Exception e) {}
있지만, 특히 내부 상황에서 사람들이 모퉁이를 깎는 것을 보지 못한 경우가 많습니다.
수업을 이용하는 사람들이 나쁜 코드를 작성하도록하지 마십시오.
나는 이것의 중요성은 자바 SE 7 줄어들 단일 catch 문이 여러 예외를 잡을 수 나중에 있기 때문에 (것을 지적해야 여러 예외 유형 잡기 및 확인 향상된 유형과 예외 Rethrowing 오라클을).
Java 6 및 이전 버전에서는 다음과 같은 코드가 있습니다.
public void delete() throws IOException, SQLException {
/* ... */
}
과
try {
foo.delete()
} catch (IOException ex) {
logger.log(ex);
throw ex;
} catch (SQLException ex) {
logger.log(ex);
throw ex;
}
또는
try {
foo.delete()
} catch (Exception ex) {
logger.log(ex);
throw ex;
}
Java 6에서 이러한 옵션 중 어느 것도 이상적이지 않습니다. 첫 번째 방법은 위반 DRY . 여러 예외가 같은 일을 반복해서 반복합니다-각 예외마다 한 번씩. 예외를 기록하고 다시 throw 하시겠습니까? 승인. 각 예외에 대해 동일한 코드 줄.
두 번째 옵션은 몇 가지 이유로 더 나쁩니다. 첫째, 그것은 당신이 모든 예외를 잡고 있음을 의미합니다. 널 포인터가 거기서 잡히지 않아야합니다. 또한, 당신은 코드를 다시 사용하는 사람들이 강제 로 스택을 더 혼란스럽게 만드는 Exception
메소드 서명이 될 것을 의미 하는를 다시 던지고 있습니다 .deleteSomething() throws Exception
catch(Exception e)
자바 7, 이것은 아니다 으로 대신 할 수 있기 때문에 중요합니다 :
catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
또한, 하나의 경우 검사 유형 않는 예외의 유형을 잡기가 발생되고 :
public void rethrowException(String exceptionName)
throws IOException, SQLException {
try {
foo.delete();
} catch (Exception e) {
throw e;
}
}
그 인식 유형 검사는 e
수 만 종류의 수 IOException
또는 SQLException
. 나는 여전히이 스타일의 사용에 대해 지나치게 열성적 인 것은 아니지만 Java 6에서와 같이 나쁜 코드를 일으키지 않습니다 (메소드 서명이 예외를 확장하는 수퍼 클래스가되도록 강요 할 것입니다).
이러한 모든 변경에도 불구하고 많은 정적 분석 도구 (Sonar, PMD, Checkstyle)는 여전히 Java 6 스타일 안내서를 시행하고 있습니다. 나쁜 것이 아닙니다. 나는 이것들이 여전히 시행 될 것이라는 경고에 동의하는 경향이 있지만, 당신은 당신의 팀이 우선 순위를 정하는 방법에 따라 우선 순위를 주 또는 부로 변경할 수 있습니다.
예외가 선택 또는 선택 취소해야하는 경우 ... 그의 문제입니다 g의 r에 전자 t의 논쟁 하나가 쉽게 인수의 각면을 차지 수많은 블로그 게시물을 찾을 수 있습니다. 그러나 확인 된 예외로 작업하는 경우 적어도 Java 6에서 여러 유형을 던지지 않아야합니다.