문제

주어진: Throwable ~이다 Exception의 슈퍼클래스.

자신만의 '예외' 작성에 관한 텍스트를 읽을 때 다음과 같은 예를 봅니다. Throwable 에서 사용되는 catch 블록 및 기타 텍스트 표시 new Exception() 에서 사용되는 catch 차단하다.나는 각각을 언제 사용해야 하는지에 대한 설명을 아직 보지 못했습니다.

내 질문은 언제 해야 하는가입니다. Throwable 사용해야 하며 언제 사용해야 합니까? new Exception() 사용될까?

내부 catch 또는 else 다음 중 하나를 사용하여 차단합니다.

throw throwable;

또는

throw new Exception();
도움이 되었습니까?

해결책

(의견에서) 이것을 제기 한 문제는 컬렉션이 구축되지 않으면 동료가 구축하는 코드에 '예외'를 ​​전달해야한다는 것입니다.

그런 경우에는 던지기를 원할 수도 있습니다. 확인된 예외.당신은 던질 수 있습니다 Exception, 적절한 기존 하위 클래스(예외 RuntimeException 그리고 그 서브클래스는 선택 해제됨) 또는 다음의 사용자 정의 하위 클래스 Exception (예:"CollectionBuildException").참조 예외에 대한 Java 튜토리얼 Java 예외에 대한 최신 정보를 얻으려면

다른 팁

항상 던지세요 Exception (절대 Throwable).당신은 일반적으로 잡지 않습니다 Throwable 둘 중 하나지만 가능합니다.Throwable은 슈퍼클래스입니다. Exception 그리고 Error, 그래서 당신은 잡을 것입니다 Throwable 당신이 잡을 뿐만 아니라 Exception하지만 Error아, 그게 중요한 점이에요.문제는, Error는 일반적으로 일반 응용 프로그램이 포착하지도, 포착하지도 말아야 하는 것이므로 그냥 사용하세요. Exception 특별한 사용 이유가 없는 한 Throwable.

실제로 예외를 포착하고 "새 예외"처럼 일반적인 새 예외를 발생시켜서는 안 됩니다.

대신, 예외를 발생시키려면 다음을 수행하십시오.

try {
    // Do some stuff here
}
catch (DivideByZeroException e) {
    System.out.println("Can't divide by Zero!"); 
} 
catch (IndexOutOfRangeException e) { 
    // catch the exception 
    System.out.println("No matching element found.");
}
catch (Throwable e) {
    throw e; // rethrow the exception/error that occurred
}

원래 예외의 원인을 피할 수 있는 충분한 컨텍스트를 제공하는 유용한 사용자 정의 예외를 발생시키지 않는 한, 예외를 포착하고 코드 블록에 발생한 예외 대신 새 예외를 던지는 것은 좋은 습관이 아니라고 생각합니다. .

단어를 볼 수 있는 곳은 두 곳뿐입니다. Throwable 코드에서:

public static void main(String args[])
{
     try
     {
         // Do some stuff
     }
     catch(Throwable t)
     {

     }
 }

그리고

public class SomeServlet extends HttpServlet
{
      public void doPost(HttpRequest request, HttpResponse response)
      {
         try
         {
             // Do some stuff
         }
         catch (Throwable t)
         {
              // Log
         }
      }
 }

Throwable은 클래스가 아니라 인터페이스입니다. 두 클래스는 Throwable, Exception 및 Error를 확장합니다.

규칙은 다음과 같습니다.예외를 포착할 때 최대한 구체적이어야 합니다. 즉, Throwable 대신 Exception을 포착하고 Exception 대신 IOException을 포착하는 것을 의미합니다.

오류를 잡지 마십시오. 오류는 버그입니다.대신 코드를 수정하세요.

절대적으로 모든 것을 잡아야 한다면 "catch Throwable"을 사용하세요. 그러나 이것은 나쁜 형식입니다.

throw new Exception(); 당신이해야 할 일입니다 절대 catch 블록에서 수행하지만 던지기를 해야 하거나 던지기를 원할 수도 있습니다. new SomeException(throwable); (전체 스택 추적 유지) 대신 throw throwable; 귀하의 메소드의 API를 준수하기 위해.던지겠다고 선언했을 때 SomeException 하지만 당신은 오류를 발생시킬 수 있는 코드를 호출하고 있습니다. IOException 메소드에 추가하고 싶지 않은 것 throws 절.

아마도 가장 흔한 경우는 new RuntimeException(throwable); 갖는 것을 피하기 위해 throws 조항을 아예.많은 사람들은 확인된 예외를 사용해야 하기 때문에 이것이 끔찍한 남용이라고 말할 것입니다.IMO 그것들은 틀렸고 확인된 예외는 보기 흉하고 유지 관리할 수 없는 코드를 초래하는 Java 언어 설계의 실수입니다.

Java가 처음 나왔을 때 들었던 것처럼 Throwable은 예외가 아닌 다른 경우에 제어권을 전달하는 데 사용될 수 있다는 이론이었습니다.나는 그것이 그런 식으로 사용되는 것을 본 적이 없습니다(아마도 그것은 매우 좋은 일일 것입니다).

그러니 그냥 Exception을 잡아보세요(더 나은 방법은 좀 더 세분화된 예외입니다).

Throwable은 프로그램의 컨테이너나 메인 루프에서만 포착되도록 되어 있습니다.대부분의 경우 예외 아래의 항목을 포착합니다. 예를 들어 오류는 프로그램에 많은 기능을 추가하지 않습니다. 결국 VirtualError 다른 오류가 발생하면 무엇을 할 수 있습니까?로그하고 계속하는 것 외에는 많지 않습니다.

모든 예외는 결국 문제입니다 ...오류는 버그일 뿐 아무 의미도 없습니다.

오류는 버그가 아닙니다. 호스트 VM에서 발생하는 문제입니다(예: OutOfMemoryError).예외는 현재 작업이 실패했음을 알리고 일부 진단을 제공하는 데 사용할 수 있는 수단입니다.

일반적으로 Throwable을 던지거나 잡지 않습니다.특히 JVM 오류( Error() 확장)는 의미했다 이상한 시스템 수준 작업을 수행하지 않는 한 사용자 코드에 걸릴 수 있습니다.

"Throwable"을 언어 가공물로 취급합니다."Exception" 클래스는 코드 블록이 정상적으로 종료되지 않거나 값을 반환하여 "예외적으로" 종료되기를 원하는 프로그래머가 사용하도록 의도된 클래스이기 때문에 이름이 지정되었습니다.

여기에는 일반적인 오류 상황(JVM 오류와 반대되는 "일반"이라는 의미)과 예외를 제어 메커니즘으로 사용하는 장소가 모두 포함됩니다.

예외를 "반환 유형"으로 사용하면 안 됩니다...

던지는 조건이 일반적인 경우 해당 조건을 호출 루틴으로 반환하기 위해 엄청난 양의 리소스를 소비하게 됩니다.예외를 구성하는 데 비용이 많이 듭니다.

예를 들어 예외를 "부정적"으로 발생시키는 긴밀한 루프가 있는 경우를 보았습니다.ID 할당, 이 루틴이 CPU 시간의 약 99%를 차지합니다..대신 문서화된 반환 상수로 변경하면 이는 25%로 떨어졌습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top