던지기 또는 시도 잡기
throws
방법에 절을 추가 할지 아니면 ?를 사용 할지 아니면 추가 할지 아니면 ?try-catch
필자가 읽은 내용 throws
에서 호출자가 계약 (객체 전달)을 종료 try-catch
했을 때 호출 할 때를 호출하고 메소드 내에서 수행되는 작업이 있습니다. 이 올바른지? 당신은 발신자 측에서 무엇을해야합니까?
추신 : Google과 SO를 통해 검색했지만 이에 대한 명확한 답변을 원합니다.
- 의미있는 방식으로 처리 할 수있는 경우에만 예외 처리
- 현재 메서드의 소비자가 처리 할 경우 예외를 위쪽으로 던지는 선언
- 입력 된 변수로 발생하는 예외가 발생하는 경우 예외 발생 (하지만 더 자주 선택되지 않는 경우)
일반적으로 메서드는 관련 문제를 로컬에서 처리 할 수없는 경우 호출자에게 예외를 던져야합니다. 예를 들어 메소드가 주어진 경로를 가진 파일에서 읽어야한다면, IOExceptions
현명한 방식으로 로컬에서 처리 할 수 없습니다. 유효하지 않은 입력에도 동일하게 적용하고, IllegalArgumentException
이 경우 와 같이 확인되지 않은 예외를 던지는 것이 개인적인 선택 입니다.
그리고 다음과 같은 경우 호출 된 메서드에서 예외를 잡아야합니다.
- 이것은 로컬에서 처리 할 수있는 것입니다 (예 : 입력 숫자를 숫자로 변환하려고 시도하고 변환에 실패하면 대신 메모리를 반환하는 것이 전적으로 유효합니다).
- 또는 예외가 발생하지 않아야합니다 (예 : 구현 세부 사항이 호출자에게 표시되지 않아야하는 구현 관련 하위 계층에서 예외가 발생하는 경우 - 예를 들어 엔티티를 지속하는
DAO
데 사용 하는 것을-display하고 싶지Hibernate
않으므로 나는 모든 것을HibernateExceptions
로컬 에서 잡아서 내 자신의 예외 유형으로 변환합니다).
내 개인적인 경험 법칙은 간단합니다.
- 의미있는 방식으로 처리 할 수 있있 업데이트 (댓글에서 추가됨)? 따라서 코드를
try/catch
. 처리한다는 것은 사용자에게 알리거나 오류로부터 복구하거나 더 넓은 의미에서 예외가 내 코드 실행에 어떤 영향을 미치는지를 의미합니다. - 다른 곳에 버려
참고 :이 답글은 이제 커뮤니티 위키입니다. 더 많은 정보를 자유롭게 추가 할 수 있습니다.
내가 사용하는 방법은 다음과 가능합니다.
던졌다 :
- 오류가 발생하면 코드가 중지되기를 원합니다.
- 특정되지 않은 전제 조건이 발생하기 쉬운 방법에 적합합니다.
Try-Catch :
- 프로그램이 다른 오류로 다르게 작동하려는 경우.
- 최종 사용자 에게 의미있는 오류를 제공하려는 경우 유용 합니다.
나는 사용하는 많은 사람들을 항상 던집니다.
메소드에 try-catch 또는 throws 절을 추가하는 결정은 "예외를 처리하는 방법"에 따라 계속합니다.
예외를 처리하는 방법은 방법은 간단한 질문과는 거리가 멀습니다. 특히 예외를 처리 할 위치와 블록 내에서 구현할 작업을 결정합니다. 사실, 예외를 처리하는 방법은 글로벌 디자인 결정해야합니다.
따라서 귀하의 질문에 답할 때 경험 법칙이 없습니다.
예외를 처리 할 위치를 결정해야하며 그 결정은 일반적으로 도메인 및 응용 프로그램 요구 사항에 따라 달라집니다.
예외가 발생하는 경우 처리 할 충분한 정보가있는 경우 처리 할 충분한 정보가있는 경우에 유용한 정보를 처리하고 있어야합니다.
는 메서드 throws
개체의 상태,에 전달 된 메서드 매개 변수 및 메서드가 작동하는 다른 모든 개체를 둘러싼 합리적인 보장을 할 수있는 경우 에만 예외가 되어야 합니다. 예를 들어, 호출자가 포함 할 것이 예상하는 항목을 컬렉션 검색에서 검색하는 경우에 수집하는 컬렉션 throws
에있을 것으로 예상되는 항목이없는 경우 체크 된 예외 일 수 있습니다 . 해당 예외를 호출하는 호출 컬렉션에 해당하는 것이 있고 예상해야합니다.
Java는 다음과 같은 유형의 예외를 발생시키는 것으로 선언 된 메소드를 통해 확인 된 예외가 버블 링 기능하지만, 사용은 일반적으로 안티 패턴으로 처리되어야합니다. 예를 들어, 어떤 메서드 LookAtSky()
가를 호출 하는 선언되고 FullMoonException
달이 가득 차면이를 던질 예측해 상상해 . 더 상상해 발견, 그 LookAtSky()
호출 ExamineJupiter()
은 throws FullMoonException
. A는 경우 FullMoonException
가 발생하고 ExamineJupiter()
, 그리고 경우 LookAtSky()
중 하나를 잡을 필요없이 처리하거나 다른 예외 유형에 포장라는 코드 LookAtSky
예외를 가정 할 전체 인 지구의 달의 결과였다; 목성의 위성 중 하나가 범인 일 수 단서가 없습니다.
호출 처리 할 것이 예상 할 수있는 예외 (기본적으로 모든 예외 포함)는 예외가 호출 된 메서드와 동일한 의미를 메서드 호출자에게 의미하는 경우에만 메서드를 통해 모든 것이 허용되어야합니다. 코드가 일부 검사 된 예외를 던지는 선언 선언 된 메서드를 호출하지만 호출 한 선언 된 예외를 throw 할 것으로 예상하지 않는 경우 (예 : 사전 개최 된 메서드 인수를 생각하기 때문에) 검사 된 예외를 즉시 처리하고 래핑해야합니다. . 일부 확인되지 않은 예외 유형에서. 호출되지 않을 경우 예외가 없을 경우에는 예외가 없습니다.
무엇을 사용할 때. 이것에 대해 많이 검색했습니다. 엄격하고 빠른 규칙은 없습니다.
"하지만 개발자로서 검사 예외는 메소드의 발생 절에 포함되어야합니다. 이것은 컴파일러가 어떤 예외를 검사 해야하는지 아는 데 필요합니다 . 관례 적으로 확인되지 않은 예외는 슬로우 절에 포함되지 않아야합니다. 포함 된 예외
는 고려 잘못된 프로그래밍 관행입니다. 컴파일러는 주석으로 처리하고 확인하지 않습니다. "
출처 : Kathy Sierra의 SCJP 6 책
catch를 사용하면 예외가 발생해도 나머지 코드는 계속 실행됩니다.
예외를 throw하는 방법을 지정하면 예외가 발생하면 코드 실행이 중지됩니다.
try-catch 쌍은 예외가 발생하는 경우 사용자 정의 동작을 제공하려는 경우 사용됩니다 ..... 즉, 프로그램 요구 사항에 따라 문제 (예외 발생)에 대한 솔루션이 있습니다 .....
그러나 예외 발생 사례에 대한 해결책이 없을 때 사용됩니다. 프로그램의 비정상적인 종료를 발표는 ....
그것은 그것이하기를 바랍니다 :-)
참고 URL : https://stackoverflow.com/questions/3203297/throws-or-try-catch
'ProgramingTip' 카테고리의 다른 글
Write-Host와 Write-Output의 PowerShell 차이점은 무엇입니까? (0) | 2020.11.05 |
---|---|
한 문서에서 다른 문서로 조건부 서식을 비용 지불해야합니까? (0) | 2020.11.05 |
CSS 속성에서 '자동'값의 의미는 무엇입니까? (0) | 2020.11.05 |
xsl에서 템플릿의 "모드"에 대한 예제를 제공 할 수 있습니까? (0) | 2020.11.05 |
사용으로 사용할 블록을 취하는 메소드 구현 (0) | 2020.11.05 |