【问题标题】:Exception message in ServletServlet 中的异常消息
【发布时间】:2013-12-03 19:11:02
【问题描述】:

我有 JSON-RPC 服务(一个使用反射调用方法的类),我想将异常作为数据传递给错误对象。所以我尝试在 Servlet 中捕获异常,但 e.getMessage() 返回 null,显示回溯根本不显示我的代码(只有获取堆栈跟踪的函数和我调用它的地方):

public Object loadService() throws InstantiationException, ClassNotFoundException, IllegalAccessException {
    ClassLoader parentClassLoader = ServiceReloader.class.getClassLoader();
    ServiceReloader classLoader = new ServiceReloader(parentClassLoader);
    //ClassLoader classLoader = init.class.getClassLoader();
    Class aClass = classLoader.loadClass("pl.jcubic.Service");
    return aClass.newInstance();
}
public String backTrace() {
    StackTraceElement[] stack = (new Throwable()).getStackTrace();
    String trace = "";
    for (int i=0; i<stack.length; ++i) {
        trace += stack[i].toString() + "\n";
    }
    return trace;
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Object id = null;
    try {
        JSONRPC2Request reqIn = JSONRPC2Request.parse(this.getInputData(request));
        id = reqIn.getID();

        Object service = loadService();

        Method[] methods = service.getClass().getMethods();

        Object result = method.invoke(service, params);
        JSONRPC2Response respOut = new JSONRPC2Response(result, id);
        out.println(respOut);

    } catch (InvocationTargetException e) {
        out.println(internalError(id, e.getMessage(), backTrace()));
    }
}

当一个方法抛出像 throw new Exception("Error occured"); 这样的异常(我想使用 JSON-RPC 发送的消息)时,我得到了这个回溯,

init.stackTrace(init.java:65)
init.doPost(init.java:119)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
java.lang.Thread.run(Thread.java:724)

有什么方法可以显示我抛出的异常吗?

【问题讨论】:

  • 为什么不使用所抛出异常的回溯?
  • @DaveNewton 我想在 JavaScript 中查看回溯,但比回溯更重要的是错误消息。我需要知道我的代码发生了什么,消息“内部错误”什么也没告诉我。
  • 如果抛出的异常没有消息,就没有消息。我的观点是,您正在创建一个新的 throwable 并公开 that 堆栈跟踪,而您应该使用实际异常的堆栈跟踪。我不知道internalError 的功能是什么。您是构建可能引发调用异常的信息的人,因此如何捕获该信息以供以后使用应该是显而易见的。
  • @DaveNewton internalError 创建 JSON-RPC 错误对象第一个参数是 ID 第二条消息,最后一个是异常跟踪。异常总是有一条消息正常异常,但看起来我抛出了不同的异常。这就是您在 Java stackoverflow.com/questions/1069066/… 中获取异常跟踪的方式

标签: java json exception servlets json-rpc


【解决方案1】:

我这里有两个错误:

  1. 我使用新的 Trowable 来创建回溯我应该使用现有的异常:

    public String backTrace(Throwable e) {
        StackTraceElement[] stack = e.getStackTrace();
        String trace = "";
        for (int i=0; i<stack.length; ++i) {
            trace += stack[i].toString() + "\n";
        }
        return trace;
    }
    
  2. 而且我需要使用Throwable的getCause()方法来获取真正的Exception(不知道是不是因为反射才需要使用):

    } catch (InvocationTargetException e) {
        Throwable cause = e.getCause();
        out.println(internalError(id, cause.getMessage(), backTrace(cause)));
    }
    

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多