gpt4 book ai didi

java - 在 Java 中实现 HttpHandler.handle() 时堆栈跟踪中没有 RuntimeException

转载 作者:行者123 更新时间:2023-11-29 03:29:46 25 4
gpt4 key购买 nike

我正在开发一个必须通过 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 方法中获取异常,但我没有从处理程序方法中获取任何内容。有没有人见过这样的事情?运行时异常应该始终在堆栈跟踪中。

谢谢,佐尔坦

最佳答案

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

快速查看内部类:

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

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

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

这个类中的大多数异常都由内部记录器处理。由于 RuntimeException 扩展了 Exception,它可能在某处被处理。

关于java - 在 Java 中实现 HttpHandler.handle() 时堆栈跟踪中没有 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18867737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com