2011-09-29 4 views
2

Apache Tomcat (v6.0.32)에서 XML을 XHTML로 변환하는 데 Apache Xalan (v.2.7.1)을 사용하고 있습니다. 때때로 로딩은 클라이언트에 의해 취소됩니다 다음과 같은 예외가 발생합니다 :자바에서 중첩 예외를 잡는 방법

javax.xml.transform.TransformerException: org.apache.xalan.xsltc.TransletException: ClientAbortException: java.io.IOException 
    at org.apache.xalan.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:636) 
    at org.apache.xalan.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:303) 
... 

나는 그것이 로그를 스팸하지 않습니다 있도록 ClientAbortException-예외를 잡을 싶습니다. 그러나 예외가 ClientAbortException 내부에 중첩되어 있는지 어떻게 확인할 수 있습니까? 나는 이런 것을 시도했다 :

... 
} catch (Exception e) { 
    if (e.getCause() != null && e.getCause().getCause() instanceof org.apache.catalina.connector.ClientAbortException) { 
     //do nothing 
    } else { 
     throw e; 
    } 
} finally { 
... 

그러나 첫 번째 getCause에는 getCause가 없으므로 nullpointerexception 만 제공한다. 어떤 아이디어?

답변

3

Apache Commons-lang에서 ExceptionUtils.getRootCause(Throwable) 메서드를 사용하면 원인 체인을 통과합니다.

+0

팁 주셔서 감사하지만 ExceptionUtils.getRootCause는 "org.apache.xalan.xsltc.TransletException"만 반환하는 것으로 보이므로 예외가 발생하지 않아 중첩 된 예외를 사용하여 추적 할 수 없습니다. – brunnsbe

1

getCause()이 null을 반환하는 경우 javax.xml.transform.TransformerException에는 실제로 원인이 없습니다. Exception이 생성 될 때, 당신은 원인을 명시 할 필요가 있으며, 아마도 이것을하지 않았을 것입니다. 아마도 그것에 대해 아무 것도 할 수 없습니다.

한 가지 방법이 바로 예외 @ 용의 getMessage에 일치하는 문자열을 사용하는 수 있다면 당신은 확인할 수 있습니다 그러나

... 
} catch (Exception e) { 
    if (e.getMessage().contains("ClientAbortException:")) { 
     // at least log the error, in case you've got something wrong 
    } else { 
     throw e; 
    } 
} finally { 
... 

, 이것은이에 따라 달라 명백한 이유, 신뢰할 수 있습니다 메시지의 텍스트

편집 : 생각해 보면 프로덕션 환경에서이 예외를 잡는 것이 나쁜 생각이거나 코드가 잘못되었다는 것을 알 수 있으므로이 동작을 켜거나 끌 수있는 방법을 추가하는 것이 좋습니다. 아이디어 :

... 
} catch (Exception e) { 
    if (System.getProperty("abort.when.ClientAbortException") == null && e.getMessage().contains("ClientAbortException:")) { 
     // at least log the error, in case you've got something wrong 
... 

적어도 코드를 끄는 옵션이 있습니다. System.getProperty는 그 예입니다.

+0

그래, 그건 가능한 한 (하지만 좀 못생긴) 솔루션입니다, 나는 그것이 특정 예외를 "잡을 수있는 유일한 방법 인 것처럼 보이는 것처럼 그것과 함께 가야만 할 것 같아요. – brunnsbe

+0

나는 그것이 추한 것에 동의하지만 그것은 유일한 방법 인 것처럼 보인다. 그것을 끄기위한 추가 옵션. –

관련 문제