1

我正在开发一个应用程序,它必须通过 HTTP 提供一些 XML 文件。对于 HTTP 服务器实现,我使用 com.sun.net.httpserver.HttpServer 并创建了一个实现 HttpHandler 的处理程序类。非常奇怪的是,我无法从 MyHandler.handle() 方法中获得任何 RuntimeException。我整理了一个示例代码来重现我正在努力解决的案例:

服务器代码:

public class HttpServerTest {
    public static void main(String[] args) {
        HttpServer server;

        try {
            server = HttpServer.create(new InetSocketAddress(8080),0);
            server.createContext("/", new MyHandler());
            server.start();
        } catch (IOException ex) {
            Logger.getLogger(HttpServerTest.class.getName()).log(Level.SEVERE, null, ex);
        }
        throw new RuntimeException("Very Important Exception from main");
    }
}

和处理程序:

class MyHandler implements HttpHandler {

    public MyHandler() {
    }

    @Override
    public void handle(HttpExchange he) throws IOException {
        System.out.println("hello");
        throw new RuntimeException("Very Important Exception from MyHandler.handle");
    }

}

输出:

Exception in thread "main" java.lang.RuntimeException: Very Important Exception from main
        at httpservertest.HttpServerTest.main(HttpServerTest.java:26)
hello
hello
hello
hello
hello
hello

如您所见,我可以从主类的 main 方法中获取异常,但我没有从处理程序方法中获取任何内容。有没有人见过这样的东西?运行时异常应该始终在堆栈跟踪跟踪中。

谢谢,佐尔坦

4

3 回答 3

4

最明显的原因是异常是在内部处理的。

快速查看内部类:

创建的 HttpServer 实际上是包装sun.net.httpserver.ServerImpl的扩展 (HttpsServerImpl) 最后一个是您需要查看的。

我发现至少有一个可以处理所有异常的捕获(尽管我不知道这个是否可以处理您的异常,要阅读很多代码):

} catch (Exception localException) {
          ServerImpl.this.logger.log(Level.FINER, "Dispatcher (7)", localException);
}

此类中的大多数异常由内部记录器处理。而且由于 RuntimeException 扩展了 Exception 它可能在那里的某个地方处理。

于 2013-09-18T11:14:44.403 回答
1

实际上,这只是throws IOException从被覆盖的处理程序中删除的问题,并添加一个通用的 Exception catch 子句来覆盖你的被覆盖的方法体,如下所示:

class MyHandler implements HttpHandler {

    public MyHandler() {

    @Override
    public void handle(HttpExchange he){
        try{
               System.out.println("hello");
               throw new RuntimeException("Very Important Exception from MyHandler.handle");
        catch(Exception e){
               e.printStackTrace()
        }
    }
}
于 2015-08-13T18:41:51.713 回答
0

当我在寻找为什么某些代码根本没有执行并且我没有收到任何错误时,我也遇到了一个问题的延迟响应。

获得一些调试信息和代码行链接的简单方法:

class ChangeLevel implements HttpHandler {
    @Override
    public void handle(HttpExchange t)   {
    

        try {
            // do stuff
        } catch (Exception e) {
            System.out.println("Error: "+e.getMessage());
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            String sStackTrace = sw.toString(); // stack trace as a string
            System.out.println(sStackTrace);
        }
    }
}
于 2021-02-16T00:55:29.433 回答