Hprose-java之異常處理

Sidyhe發表於2016-06-22

測試環境: IDEA + JETTY + HPROSE

若要獲取介面異常通知(回撥)

需呼叫ServletHolder的setInitParameter方法, key為"event", 值為HproseServiceEvent


示例程式碼:

public class XServletHolder extends ServletHolder {
    public XServletHolder(Servlet servlet) {
        super(servlet);
        this.setInitParameter("event", XServiceEvent.class.getName());
    }
}

/**
 * Created by Sid on 2016/6/22.
 * 記錄當前包所屬程式碼的異常資訊
 */
public class XServiceEvent implements HproseServiceEvent {
    String logPrefix;

    public XServiceEvent() {
        logPrefix = this.getClass().getPackage().getName() + ".";
    }

    @Override
    public void onBeforeInvoke(String s, Object[] objects, boolean b, HproseContext hproseContext) throws Throwable {

    }

    @Override
    public void onAfterInvoke(String s, Object[] objects, boolean b, Object o, HproseContext hproseContext) throws Throwable {

    }

    @Override
    public Throwable onSendError(Throwable throwable, HproseContext hproseContext) throws Throwable {
        StringBuffer message = new StringBuffer();
        StackTraceElement[] trace = throwable.getStackTrace();

        message.append(throwable.toString());
        for (StackTraceElement traceElement : trace) {
            if (traceElement.getClassName().startsWith(logPrefix)) {
                message.append("\n\tat ").append(traceElement);
            }
        }
        Logger.getRootLogger().error(message);
        return null;
    }

    @Override
    public void onServerError(Throwable throwable, HproseContext hproseContext) {

    }
}


啟動時:

ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);

handler.setContextPath("/");

handler.addServlet(new XServletHolder(new XXX), "/XXX");


以下是作者原話:

伺服器端有個HproseServiceEvent

通過實現這個介面,並進行設定,就可以記錄異常了。

onSendError 是當伺服器端異常轉發給客戶端時觸發
onServerError 是伺服器端無法傳送資料給客戶端併產生異常時觸發。

在 onSendError 裡面,你還可以丟擲一個新的異常或者返回一個新的異常,來替換傳入的異常。