2012-03-24 54 views
9

Tôi đã tìm kiếm một mẫu xử lý ngoại lệ cho Netty nhưng tôi không thể tìm thấy nhiều.Xử lý ngoại lệ Netty - Trình xử lý ném ngoại lệ, sau đó là gì?

Một số loại hướng dẫn xử lý ngoại lệ sẽ tuyệt vời. Tôi có ngoại lệ ném được gửi đến exceptionCaught nhưng tôi không biết phải làm gì tiếp theo.

Ai đó có thể cung cấp giải thích chung về cách xử lý ngoại lệ trong Netty. Mô hình dự kiến ​​để xử lý một ngoại lệ được ném từ một ChannelHandler là gì?

Cảm ơn, Matt

Trả lời

2

Nó thực sự phụ thuộc vào thực hiện của bạn và những gì loại ngoại lệ. Đôi khi bạn có thể phục hồi, những lúc khác có thể là cách tốt nhất để chỉ đóng kênh.

Vì vậy, tôi nghĩ rằng nó không thể cho bạn biết làm thế nào để xử lý nó ..

2

Đồng ý với Norman.

Nói chung, tôi cố gắng nắm bắt và xử lý tất cả ngoại lệ của ứng dụng và trả về các thư thích hợp chứa lỗi.

Ví dụ: trong máy chủ HTTP, tôi sẽ trả lại 404 nếu không tìm thấy tệp.

Tôi cũng thêm chức năng sau trong trình xử lý của mình cho bất kỳ ngoại lệ nào mà tôi không nắm bắt - mà theo lý thuyết chỉ nên là lỗi loại mạng. Tôi có xu hướng thực hiện một cách tiếp cận đen trắng với những ngoại lệ này và giả định rằng tôi không thể phục hồi. Do đó, tôi đóng kênh. Nó sẽ tùy thuộc vào khách hàng để thử lại.

@Override 
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { 
    try { 
     _logger.error(e.getCause(), "ERROR: Unhandled exception: " + e.getCause().getMessage() 
       + ". Closing channel " + ctx.getChannel().getId()); 
     e.getChannel().close(); 
    } catch (Exception ex) { 
     _logger.debug(ex, "ERROR trying to close socket because we got an unhandled exception"); 
    } 
} 

Hy vọng điều này sẽ hữu ích.

3

Vì Norman và Veebs đều đề cập đến, mà không hiểu các yêu cầu chính xác của bạn, bạn sẽ thấy một chút khó khăn khi đưa ra một câu trả lời chính xác ... Tôi nghĩ sau đây cung cấp cách chung để xử lý lỗi máy chủ mà bạn không mong đợi. Nó trả về HTTP 500 'Internal Server Error' cho máy khách và sau đó đóng kênh. Rõ ràng là tôi đang giả định rằng các khách hàng của bạn đang yêu cầu và nhận qua HTTP mà họ có thể không, trong trường hợp đó, giải pháp của Veebs là tốt hơn.

import org.jboss.netty.channel.ChannelFutureListener; 
import org.jboss.netty.channel.ChannelHandlerContext; 
import org.jboss.netty.channel.ExceptionEvent; 
import org.jboss.netty.channel.SimpleChannelHandler; 
import org.jboss.netty.handler.codec.http.DefaultHttpResponse; 
import org.jboss.netty.handler.codec.http.HttpResponse; 
import org.jboss.netty.handler.codec.http.HttpResponseStatus; 
import org.jboss.netty.handler.codec.http.HttpVersion; 

public class ServerErrorHandler extends SimpleChannelHandler { 
    @Override 
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) 
     throws Exception { 
     HttpResponse err = new DefaultHttpResponse(HttpVersion.HTTP_1_1, 
              HttpResponseStatus.INTERNAL_SERVER_ERROR); 
     e.getChannel().write(err).addListener(ChannelFutureListener.CLOSE); 
    } 
} 

Lưu ý nếu bạn sử dụng giải pháp này thì bạn cũng cần phải thêm HttpResponseDecoder vào đường ống của mình.

Rõ ràng nếu bạn có ngoại lệ cụ thể mà bạn muốn nắm bắt và xử lý thì bạn sẽ viết thêm một số logic ở đây để làm điều đó.

HTH!