Java 응용 프로그램에서 작업 중이며 런타임 예외가 여러 곳에서 처리되는 것을 볼 수 있습니다. 예를 들어
try {
// do something
} catch(NullPointerException e) {
return null;
}
내 질문은 언제 런타임 예외를 처리하는 것이 좋은 습관입니까? 예외는 언제 처리해야합니까?
Java 응용 프로그램에서 작업 중이며 런타임 예외가 여러 곳에서 처리되는 것을 볼 수 있습니다. 예를 들어
try {
// do something
} catch(NullPointerException e) {
return null;
}
내 질문은 언제 런타임 예외를 처리하는 것이 좋은 습관입니까? 예외는 언제 처리해야합니까?
답변:
때에 따라 다르지.
예를 들어, 제공된 문자열을 구문 분석 할 수없는 경우 (RTE 인) Integer#parseInt
던집니다 NumberFormatException
. 그러나 사용자가 정수 텍스트 필드에 "x"를 썼기 때문에 앱이 중단되는 것을 원하지 않습니까? 문자열을 먼저 구문 분석하지 않으면 문자열을 구문 분석 할 수 있는지 여부를 어떻게 알 수 있습니까? 따라서이 경우 RTE는 일종의 오류 메시지를 발생시키는 오류 신호일뿐입니다. 체크 된 예외 여야 한다고 주장 할 수 는 있지만 할 수있는 일은 아닙니다.
Integer#parseInt
실제로 Maybe<Integer>
대신 대신 반환하고 예외를 발생시키지 않아야합니다.
NullPointerExceptions는 일반적으로 null 검사가 누락되었음을 나타냅니다. 따라서 이와 같이 잡는 대신 예외를 발생시키지 않도록 적절한 null 검사를 추가해야합니다.
그러나 때로는 RunTimeExceptions를 처리하는 것이 좋습니다. 예를 들어, 적절한 위치에 널 검사를 추가하기 위해 코드를 수정할 수 없거나 예외가 NullPointerException 이외의 다른 경우입니다.
예외 처리의 예는 끔찍합니다. 그렇게하면 스택 추적과 문제에 대한 정확한 정보가 손실됩니다. 그리고 아마도 다른 장소에서 다른 NullPointerException을 발생시키고 발생한 문제와 해결 방법에 대한 잘못된 정보를 얻을 수 있으므로 실제로 해결하지 못합니다.
return null;
하는 것이 더 나은 해결책이 될 것입니다.
new
슬로우 std::bad_alloc
C ++에서.
예외는 그저 .. 예외입니다. 예외를 사용할 때 모범 사례는 예외를 사용하여 예상되는 것과 상반되는 상황을 처리하는 것입니다. 고전적인 예는 FileNotFoundException이며 파일이 단순히 없을 때 발생합니다. 파일의 존재를 테스트하는 경우 File.exists ()를 사용하면 단순히 10 피트 스틱으로 proding하기 때문에 무언가를 쳤는지 확인할 수 있습니다.
시도 캐치에서 파일을 둘러싸고 존재하는 것처럼 파일을 사용하여 기술적으로 동일한 결과를 얻을 수 있지만 A) 예외는 일반적으로 리소스 비용이 많이 들며 B) 프로그래머는 파일이 존재하는 경우 파일이 존재한다고 가정합니다. 시도 캐치에서 프로그램의 전반적인 혼란을 더합니다.
데이터베이스에서 일부 값을 가져 오는 메소드를 작성하는 상황이 많이 있습니다. 수천 가지 문제가 발생할 수 있으며 작은 정보가 하나만 필요한 경우 5 가지 예외가 포함 된 try catch 목록으로 호출을 둘러싸는 것이 불편합니다. 그래서 fetch 메소드에서 예외를 잡을 것입니다. 문제가 발생하면 데이터베이스 연결을 닫거나 finally 절의 내용을 닫기 위해 적절한 조치를 취하고 null을 반환합니다. 이것은 코드를 단순화 할뿐만 아니라 "null"이 예외에서 얻을 수있는 것과 동일한 메시지를 전송하기 때문에 좋은 방법입니다. 페치 메소드에서 예외 세부 사항을 관리하지만 상황이 발생할 때 수행 할 작업을 관리하십시오.
예를 들면 다음과 같습니다.
Integer getUserCount() {
Integer result = null;
try {
// Attempt to open database and retrieve data
} catch (TimeoutException e) {
logger.error("Got a watch?");
} catch (MissingDatabaseException e) {
logger.error("What are you smoking?");
} catch (PermissionsToReadException e) {
logger.error("Did you *really* think you were getting away with that?");
} catch (PressedSendButtonToHardException e) {
logger.error("Seriously.. just back away from the computer... slowly..");
} catch (WTFException e) {
logger.error("You're on your own with this one.. I don't even know what happened..");
} finally {
// Close connections and whatnot
}
return result;
}
void doStuff() {
Integer result = getUserCount();
if(result != null) {
// Went as planned..
}
}
예, 올바른 처리 런타임 예외는 좋은 방법이 아닙니다. 비용이 많이 들고 / 메모리를 많이 사용하는 것으로 간주되기 때문입니다.