2014-01-16 2 views
3

내 채널 파이프 라인에는 많은 핸들러가 있습니다. 내가 그들의 exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 메소드를 오버라이드 (override)하지 않으면 내가 알고있는 것처럼Netty 4에서 모든 처리기의 처리되지 않은 예외를 catch하는 방법은 무엇입니까?

이 기본 동작 인 cause는 파이프 라인 밖으로 던져되며, 파이프 라인에 의해 레벨을 WARN에서 이런 일이 기록 될 것입니다 :

An exception was thrown by a user handler's exceptionCaught() method while handling the following exception: ... 

특정 로직을 추가하기 위해 위의 파이프 라인 동작을 덮어 쓰고 싶습니다 (예 : causejava.io.IOException: Connection reset by peer 인 경우 WARN 레벨에서 너무 많은 "유용하지 않은"로그를 피하기 위해 아무것도 기록하지 마십시오).

어떻게해야합니까? https://github.com/netty/netty/blob/4.0/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java

private void invokeExceptionCaught(final Throwable cause) { 
    try { 
     handler.exceptionCaught(this, cause); 
    } catch (Throwable t) { 
     if (logger.isWarnEnabled()) { 
      logger.warn(
        "An exception was thrown by a user handler's " + 
        "exceptionCaught() method while handling the following exception:", cause); 
     } 
    } 
} 

private이기 때문에, 나는 쉽게 반사를 사용하지 않고 그것을 무시할 수 있다고 생각하지 않습니다 :

몇 가지 조사 후, 나는이 소스 코드를 발견했다. 더 좋은 방법이 있습니까?

답변

5

ExceptionHandler을 정의한 다음이 처리기를 파이프 라인의 끝에 배치하여이 작업을 수행 할 수 있습니다.

ChannelPipeline p = ch.pipeline(); 
p.addLast("business", new SomeBusinessHandler()); 
p.addLast... 
p.addLast("exception", new ExceptionHandler());//Make sure this is the last line when init the pipeline. 

exceptionCaught 방법으로 특정 논리를 코딩하십시오. 그러나 이것이 파이프 라인의 끝이기 때문에 예외를 다시 범하지 마십시오.

+0

확인했습니다. 이 솔루션은 작동합니다! 감사! –

1

exceptionCaught 메서드가 예외를 throw하는 이유를 잘 모르는 경우 ... ChannelHandler.exceptionCaught (..) 메서드를 재정의하고 거기에서 처리하려고한다고 생각합니다.

+0

모든 인바운드 처리기의 'exceptionCaught'을 무시할 때 예외를 catch 할 수 있습니다. 그러나 프레임 워크 사용자는 웹 프레임 워크를 작성하기 때문에 사용자가 만든 핸들러 (재정의하지 않는 핸들러)를 프레임 워크에 전달할 수 있으므로 핸들러가 exceptionCaught을 오버라이드하지 않아도 모든 예외를 catch하고 싶습니다. –

+0

예외 코드를 무시하는 ChannelPoundeline에 항상 마지막 ChannelInboundHandler가 있는지 확인하십시오 (...) –

관련 문제