IT

언제 java.lang.Error를 잡아야하나요?

lottoking 2020. 8. 3. 17:29
반응형

언제 java.lang.Error를 잡아야하나요?


상황 어떤 java.lang.Error에서 응용 프로그램을 잡아야 합니까?


일반적으로 절대로 특정 오류를 잡아야합니다.

LinkageErrors (클래스 정의 없음, 만족스럽지 않은 클래스 변경)이없는 것이 좋습니다. 또한 오류의 하위 클래스를 던지는 어리석은 클래스를 처리해야합니다.

그건 그렇고, OutOfMemory에서 복구 할 수 있는지 확실하지 않습니다.


못. 응용 프로그램이 다음 코드 줄을 확신 할 수 없습니다. 당신 OutOfMemoryError당신이 확실하게 무엇이든 할 수 있는지 보장하지 않습니다 . RuntimeException을 확인하고 예외를 확인했지만 오류는 없습니다.

http://pmd.sourceforge.net/rules/strictexception.html


일반적으로 항상 java.lang.Error로그를 청구 로그에 쓰거나 사용자에게 표시해야합니다. 나는 지원을 위해 일하고 프로그래머들이 프로그램에서 무슨 일이 있었는지 말할 수없는 것을 매일 본다.

데몬 경우가있는 경우 종료하지 않아야합니다. 다른 경우에는 응용 프로그램이 작동합니다.

당신은 java.lang.Error가장 높은 수준 에서만 잡을 수 있습니다.

오류 목록을 대부분 처리 할 수 ​​있습니다. 예를 들어 ZipError파일을 읽을 발생합니다.

가장 일반적인 오류는 OutOfMemoryErrorNoClassDefFoundError입니다. 대부분의 경우 작동 문제입니다.

예를 들면 다음과 같습니다.

int length = Integer.parseInt(xyz);
byte[] buffer = new byte[length];

할 수 생성 OutOfMemoryError있지만 런타임 문제이므로 프로그램을 종료 할 이유가 없습니다.

NoClassDefFoundError라이브러리가 높은 경우 Java 버전으로 작업하는 경우 주로 발생합니다. 프로그램의 경우 부분 인 경우 프로그램을 종료하지 않습니다.

Throwable최상위에서 제공 되는 유용한 오류 메시지를 생성하는 것이 좋은 이유에 대한 예를 더 많이 제공 할 수 있습니다 .


멀티 표준 환경에서는 가장 자주 잡아야합니다! 당신이 그것을 그것을 잡을 때, 그것을 기록하고 전체 응용 프로그램을 종료하십시오! 그렇게하지 않는 중요한 부분을 수행 할 수있는 일부가 정상이고 나머지 응용 프로그램은 모든 것이 대부분이라고 생각합니다. 그 중 많은 원치 않는 상황이 있습니다. 가장 작은 문제 중 하나는 다른 기능이 작동하지 않는 것입니다.

예를 들어, 일반적으로 루프는 다음과 같을 것입니다.

try {
   while (shouldRun()) {
       doSomething();
   }
}
catch (Throwable t) {
   log(t);
   stop();
   System.exit(1);
}

경우에 따라 OutOfMemoryError와 같이 다른 오류를 다르게 처리하고 싶을 수도 있습니다. 예를 들어 OutOfMemoryError에서는 많은 사람들로 응용 프로그램을 닫을 수 있습니다 (일부 메모리를 확보하고 계속할 수도 있음). 다른 경우에는 할 수있는 일이 많지 않습니다.


매우 드물다.

단일가 죽는 이유와 함께 메시지를 발행하기 위해 최상위 수준에서만 말하고 싶습니다.

이런 종류의 일을하는 프레임 워크에있는 프레임 워크에 두십시오.


거의 없다. 일반적으로 수행 할 수없는 문제로 설계 오류는 응용 프로그램입니다. 유일한 예외는 오류 표시를 처리하는 것이지만 오류에 따라 계획대로 진행되지 않을 수도 있습니다.


Error일반적으로 잡힐 안가 같이 발생하는 안 비정상적인 상태를 나타냅니다 .

Error클래스 의 Java API 스펙에서 :

Error클래스 는 합리적인 응용 프로그램이 하위 Throwable하려고 시도합니다 안되는 심각한 문제를 나타냅니다. 대부분의 경우 비정상적인 상태입니다. [...]

메소드는 폐기 할 필요가 없습니다. 그렇기 때문에 발생하는 비용은 절대 발생하지 않습니다.

사양이 언급 같이,이 Error단지 때 기회가있는 상황에서 발생합니다 Error아주 작은 응용 프로그램이 할 수있다, 발생하며, 경우에 따라, Java 가상 머신 자체가있는 상태에있을 수 있습니다 (예 )VirtualMachineError

있지만가 Errorsub-클래스의 Throwable어떤 그것이 의해 체포 될 수 있다는 것을 의미 try-catch이 때 응용 프로그램이 비정상 상태에있을을 구석으로 같은, 절,하지만 아마 정말 필요하지 않습니다 ErrorJVM에 의해 발생합니다.

절 에서이 주제에 대한 짧은 부분도있다 11.5 예외 계층 구조Java 언어 사양 판은 .


새 단위 테스트 프레임 워크를 작성하는 미치면 테스트 실행자가 테스트 케이스에서 java.lang.AssertionError를 반드시해야합니다.

문맥 다른 답변을 참조하십시오.


그리고 오류를 발견하면 다시 던져야 하는 몇 가지 다른 경우가 있습니다 . 예를 들어 ThreadDeath 는 절대 잡히지 않아야합니다. 포함 된 환경 (예 : 응용 프로그램 서버)에서 잡으면 큰 문제가 발생할 수 있습니다.

애플리케이션은 비동기 적으로 종료 된 후 정리해야하는 경우에만이 클래스의 인스턴스를 포착해야합니다. ThreadDeath가 메서드에 의해 잡히면 스레드가 실제로 죽도록 다시 throw되는 것이 중요합니다.


아주 드물게.

나는 아주 특정한 한 가지 알려진 경우에만 그것을했다. 예를 들어, 두 개의 독립 ClassLoader가 동일한 DLL을로드하는 경우 java.lang.UnsatisfiedLinkError가 발생할 수 있습니다 . (JAR를 공유 클래스 로더로 이동해야한다는 데 동의합니다)

그러나 가장 일반적인 경우는 사용자가 불만을 제기했을 때 무슨 일이 일어 났는지 알기 위해 로깅이 필요하다는 것입니다. 사용자에게 메시지 나 팝업이 표시되기를 원합니다.

C / C ++의 프로그래머조차도 오류를 표시하고 종료하기 전에 사람들이 이해하지 못하는 것을 말합니다 (예 : 메모리 오류).


Android 애플리케이션에서 java.lang.VerifyError를 포착하고 있습니다 . 내가 사용중인 라이브러리는 이전 버전의 OS가 설치된 장치에서 작동하지 않으며 라이브러리 코드에서 이러한 오류가 발생합니다. 물론 런타임에 OS 버전을 확인하여 오류를 피할 수 있지만 :

  • 지원되는 가장 오래된 SDK는 향후 특정 라이브러리에 대해 변경 될 수 있습니다.
  • try-catch 오류 블록은 더 큰 폴백 메커니즘의 일부입니다. 일부 특정 장치는 라이브러리를 지원해야하지만 예외를 발생시킵니다. 대체 솔루션을 사용하기 위해 VerifyError 및 모든 예외를 포착합니다.

테스트 환경에서 java.lang.AssertionError를 잡는 것은 매우 편리합니다 ...


이상적으로는 오류를 처리 / 캐치하지 않아야합니다. 그러나 프레임 워크 나 응용 프로그램의 요구 사항에 따라 우리가해야하는 경우가있을 수 있습니다. 더 많은 메모리를 소비 하는 DOM 파서구현하는 XML 파서 데몬이 있다고 가정 해 보겠습니다 . Parser 쓰레드가 OutOfMemoryError를 받았을 때 죽지 말아야한다는 요구 사항이 있다면 , 대신 그것을 처리하고 애플리케이션 / 프레임 워크 관리자에게 메시지 / 메일을 보내야합니다.


이상적으로는 비정상적인 조건이므로 Java 애플리케이션에서 오류를 포착해서는 안됩니다. 응용 프로그램이 비정상적인 상태에 있고 캐싱이 발생하거나 심각한 잘못된 결과를 초래할 수 있습니다.


어설 션이 만들어 졌는지 확인하는 단위 테스트 내에서 오류를 포착하는 것이 적절할 수 있습니다. 누군가 어설 션을 비활성화하거나 그렇지 않으면 알고 싶은 어설 션을 삭제하는 경우


JVM이 더 이상 예상대로 작동하지 않거나 직전에있는 경우 오류가 발생합니다. 오류를 발견하면 catch 블록이 실행된다는 보장이 없으며 끝까지 실행된다는 보장도 없습니다.

또한 실행중인 컴퓨터, 현재 메모리 상태에 따라 달라 지므로 최선을 다해 테스트하고 시도 할 방법이 없습니다. 당신은 끔찍한 결과를 얻을 것입니다.

또한 코드의 가독성도 저하됩니다.

참고 URL : https://stackoverflow.com/questions/352780/when-to-catch-java-lang-error

반응형