2012-04-27 5 views
4

고유 한 스레드를 만드는 라이브러리를 사용하고 있으며 예외가 발생합니다. 그 예외를 어떻게 잡을 수 있습니까? 예외는 아래에 표시된 라인에 발생합니다 :Java에서 다른 스레드가 던진 예외를 catch하는 방법은 무엇입니까?

ResourceDescriptor rd = new ResourceDescriptor(); 
     rd.setWsType(ResourceDescriptor.TYPE_FOLDER); 
     fullUri += "/" + token; 
     System.out.println(fullUri); 
     // >>> EXCEPTION THROWN ON THE FOLLOWING LINE <<< 
     rd.setUriString(fullUri.replaceAll("_", "")); 
     try{ 
      rd = server.getWSClient().get(rd, null); 
     }catch(Exception e){ 
      if(e.getMessage().contains("resource was not found")){ 
       this.addFolder(fullUri, label, false); 
       System.out.println("Folder does not exist, will be added now."); 
      }else{ 
       System.out.println("Error Messages: " + e.getMessage()); 
      } 
     } 
+1

예외를 throw하는 메서드는 어떻게 호출합니까? (그리고 아마도 : 예외가 던져지는 것을 어떻게 알 수 있을까요?) – DerMike

+0

나는 일반적인 Exception 클래스를 잡으려고 이미 시도했지만 예외가 발생합니다. 나는 그것을 봤 거든 내가 사용하고있는 라이브러리에서 다른 스레드에 의해 던져 것으로 보인다. 라이브러리는 웹 서비스를 통해 웹 응용 프로그램과 상호 작용합니다. – yuejdesigner85

답변

5

당신은 모두가 Thread 객체 인 경우 (I 가정이다 RuntimeException) 예외를 잡을 수있는 방법이 없습니다. 이 작업을 수행하는 올바른 방법은 ExecutorService에서 사용하는 Future<?> 클래스를 사용하는 것이지만 Thread을 시작하는 코드를 제어 할 수는 없습니다.

Runnable을 제공하거나 라이브러리에 코드를 삽입하는 경우 Exception을 잡아 보유하는 클래스로 래핑 할 수 있지만 예외가 코드에있는 경우에만 해당 코드를 래핑 할 수 있습니다 호출중인 코드 내에서 발생합니다. 다음과 같은 뭔가 : @Ortwin 언급 당신이 당신의 자신의 스레드를 분기하는 경우

final AtomicReference<Exception> exception = new AtomicReference<Exception>(); 
Thread thread = library.someMethod(new Runnable() { 
    public void run() { 
     try { 
     // call a bunch of code that might throw 
     } catch (Exception e) { 
     // store our exception thrown by the inner thread 
     exception.set(e); 
     } 
    } 
}); 
// we assume the library starts the thread 
// wait for the thread to finish somehow, maybe call library.join() 
thread.join(); 
if (exception.get() != null) { 
    throw exception.get(); 
} 

또한, 당신은 또한 캐치되지 않는 예외 핸들러를 설정할 수 있습니다

thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
    public void uncaughtException(Thread t, Throwable e) { 
     // log it, dump it to the console, or ... 
    } 
}); 

을하지만 경우의 내부 스레드 코드 라이브러리는 당신이 감쌀 수 없다. 그러면 작동하지 않을 것이다. 질문을 수정하고 코드를 보여주고 좀 더 자세한 내용을 제공하면보다 나은 도움을 제공하기 위해 질문을 편집 할 수 있습니다. 당신은 아마 그것을 잡을 수없는 경우

+0

'Runnable'이 아닌'Thread'를 제공한다면'join' 메소드를 오버라이드 할 수 있습니다. 이렇게하면 스레드가 예외와 함께 종료되었는지 확인하고 스레드를 조인 스레드의 컨텍스트에서 예외를 다시 throw 할 수 있습니다. – ccurtsinger

+0

@curtsinger'join'은 최종입니다 – artbristol

+0

@artbristol 네 말이 맞아. 운이 없었어. – ccurtsinger

16

는 당신을하는 데 도움이 :

당신이 UncaughtExceptionHandler을 설정하는 당신이 시도 할 수있는 Thread 객체가있는 경우. Thread.setUncaughtExceptionHandler(...)을보십시오.

은 우리에게 당신이 사용하는 라이브러리 및 사용 방법에 대한 몇 가지 자세한 내용을 줘.

+3

+1 나는 이것에 대해 몰랐다. 이것은 내 대답보다 낫다. – Gray

+0

나는 내가 사용하고있는 라이브러리에 의해 생성 된 스레드를 제어하지 못하기 때문에 명시 적으로 해당 스레드에서 캐치되지 않는 예외 처리기를 설정할 수 없습니다. 어떻게해야합니까? – yuejdesigner85

+0

[여기] (http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java)를보십시오. 그런 식으로 당신은'Thread' 객체를 가질 수 있습니다;) 물론 그것은 정말로 깨끗한 해결책은 아니지만 시도 할 가치가 있습니다. –

관련 문제