때로는 일련의 함수 호출이 있는데, 중간에 결과를 결정하고 전체 함수 체인을 중간 방식으로 중지하려고합니다. 이 경우 다음과 같은 방법이 나쁜가요?
public ResponseObject composeResponse {
try {
ResponseObject response = new ResponseObject();
processA(response);
processB(response);
processC(response);
processD(response);
.
.
.
return response;
} catch (SomeFlagException e){
return response;
}
}
각 프로세스 기능에 대해 다음과 같습니다.
public void processA(ResponseObject response){
minorProcess1(response);
minorProcess2(response);
minorProcess3(response);
.
.
.
}
일부 특정 조건 (예 : minorProcess3 ())에서는 결과가 결정되고 나머지 프로세스는 원하지 않는 경우가 있습니다. 이것이 많은 minorProcesses에서 발생한다고 가정합니다.
public void minorProcess3(ResponseObject response){
//some process
if (someFlag){
//want end the process and return the result
throw new SomeFlagException(); //SomeFlagException extends RuntimeException
}
}
내 마음은 "예외"가 아니라 예상되는 결과이기 때문에 아니오라고 말하고 있습니다. 그리고 체크되지 않은 Exception은 합리적으로 해결할 수 없을 때만 던져 져야한다고 들었습니다. 하지만 코드를 깔끔하게 만들기 위해 이런 식으로 만 생각할 수있었습니다. 그렇지 않으면 코드가 조건 검사를 기본 함수로 다시 연결해야합니다.
편집 : 내 상황에 대한 정보 추가. 웹 프로젝트이므로 페이로드로 적절한 응답을 반환한다고 가정합니다. 때때로 요청은 204 / 40x로 응답해야합니다. 페이로드가 필요하지 않으므로 추가 프로세스가 필요하지 않으며 포기해야합니다.
예, 그렇게하는 것은 정말 나쁜 습관입니다.
예외는 일부 방법이 계약을 이행 할 수 없음을 의미합니다. 당신이 묻는 접근 방식은 이것을 반대로 바꾸어 놓는다 : 조기 성공을 의미하는 예외를 사용하라
기술적으로는 작동하지만 예외의 의도 된 의미에 너무 많이 반대하므로 그러한 접근 방식을 사용하지 않는 것이 좋습니다.
그리고 체크되지 않은 Exception은 합리적으로 해결할 수 없을 때만 던져 져야한다고 들었습니다.
IMHO, 이것은 나쁜 조언입니다. 예외를 던지는 사람으로서 호출 스택의 일부 호출자 메서드가 실패 후에도 성공적으로 계속 될 수 있는지 어떻게 알 수 있습니까? 이는 호출자의 컨텍스트에서만 결정할 수 있으며 (실패에 대한 대체 전략이 있는지 여부) 예외 유형에 거의 의존하지 않습니다. 그것을 결정하는 것은 당신의 책임이 아니며, 당신이 그 결정을 내리려고하더라도 아마도 잘못된 것으로 판명 될 것입니다.
예를 들어, 발신자의 경우 NullPointerException
또는으로 인해 실패했는지 여부는 일반적으로 중요하지 않으며 IOException
선택되지 않은 / 선택된 범주의 두 가지 두드러진 예를들 수 있습니다. 중요한 것은 당신이 실패했고 아마도 호출자가 실패 후 어떻게 진행해야하는지 알고 있다는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다