Java의 finally 블록에서 반환


Answers

나는 이로 인해 야기 된 버그를 수년 전에 추적하기가 정말로 어려웠습니다. 코드는 다음과 같습니다.

Object problemMethod() {
    Object rtn = null;
    try {
        rtn = somethingThatThrewAnException();
    }
    finally {
        doSomeCleanup();
        return rtn;
    }
}

예외는 다른 코드에서 발생했습니다. 그것은 잡히고 기록되고 somethingThatThrewAnException() 메서드 내에서 다시 throw됩니다. 그러나 예외는 problemMethod() 지나쳐 전파되지 않았습니다. 이것을 보는 데 오랜 시간이 걸린 후에 마침내 그것을 반환 방법으로 추적했습니다. finally 블록의 return 메서드는 기본적으로 try 블록에서 발생한 예외가 catch되지 않은 경우에도 전파되는 것을 막습니다.

다른 사람들처럼 Java 스펙에 따라 finally 블록에서 돌아 오는 것은 합법적이지만 잘못된 결과 일 수는 없다고 말했습니다.

Question

최근 Java에서 finally 블록에 return 문을 사용할 수 있다는 사실을 알게 된 것에 놀랐습니다.

많은 사람들이 ' 마침내 돌아 오지 마라 '에서 설명한대로 할 일이 좋지 않다고 생각하는 것 같습니다. 조금 더 긁어서, 나는 또한 자바의 리턴이 항상 그렇지는 않다는 것을 발견했다. 이것은 결국 블럭에서 다른 유형의 플로우 컨트롤에 대한 아주 끔찍한 예제를 보여준다.

그래서, 내 질문은, 나에게 반환 문장 (또는 다른 흐름 제어)에서 마침내 블록 더 나은 / 더 읽을 수있는 코드를 생성하는 예제를 줄 수 있습니까?




마지막으로 {} 블록에 제어 구조와 리턴을 추가하는 것은 거의 모든 개발 언어에 흩어져있는 악용을 "할 수 있기 때문에"의 또 다른 예입니다. 제이슨은 쉽게 유지 보수의 악몽이 될 수 있다고 제안했다. 함수의 조기 반환에 대한 논쟁은 "늦게 돌아 오는"사례에 더 많이 적용된다.

마지막으로 블록은 하나의 목적을 위해 존재하며 모든 이전 코드에서 어떤 일이 발생했는지에 상관없이 자신을 완전히 정리할 수 있습니다. 기본적으로 이것은 파일 포인터, 데이터베이스 연결 등을 닫거나 놓는 것입니다.하지만 맞춤식 감사 기능을 추가한다고 말하는 것을 볼 수는 있습니다.

함수 반환에 영향을주는 것은 try {} 블록에 있어야합니다. 외부 상태를 검사하고 시간이 많이 소요되는 작업을 수행 한 다음 유효하지 않은 경우 다시 상태를 확인하는 방법이 있더라도 try {} 내부에서 두 번째 검사가 필요합니다. 그리고 장시간 작업이 실패하면, 두 번째로 불필요하게 그 상태를 점검 할 것입니다.




Links