gpt4 book ai didi

java - Spring Boot 应用程序中未调用 Thread.setDefaultUncaughtExceptionHandler

转载 作者:行者123 更新时间:2023-12-02 03:55:12 27 4
gpt4 key购买 nike

我正在尝试在 Spring Boot 应用程序中实现一个全局未捕获的异常处理程序,它从一堆客户端应用程序收集指标和异常等。看起来处理程序是在我调试时设置的,所以我会假设在我的代码运行后分配了另一个处理程序,或者这些处理程序没有在 spring 应用程序上下文中设置?我的代码如下。

我已经为我的默认异常处理程序创建了此类 -

public class JvmrtExceptionHandler implements Thread.UncaughtExceptionHandler {

private static final Logger LOGGER = LoggerFactory.getLogger(JvmrtExceptionHandler.class);
private RestTemplate restTemplate = new RestTemplate();

@Override
public void uncaughtException(Thread thread, Throwable exception) {
String exceptionClass = exception.getStackTrace()[0].getClassName();
String exceptionMethod = exception.getStackTrace()[0].getMethodName();
String exceptionMessage = exception.getMessage();
String exceptionType = exception.getClass().getSimpleName();
String appName = exception.getClass().getPackage().getImplementationTitle();
ExceptionModel thrownException = new ExceptionModel(
exceptionMessage,
appName,
exceptionMethod,
exceptionClass,
exceptionType
);

LOGGER.error("Uncaught Exception thrown of type {}. Sending to JVMRT Main app for processing", exceptionType);

String exceptionUrl = String.format("http://%s:%s/api/", "localhost", 8090);
restTemplate.postForObject(exceptionUrl, thrownException, String.class);



}

}

这个类在另一个将前一个应用程序作为 Maven 依赖项的应用程序中,配置我创建的默认处理程序。我希望该处理程序适用于所有线程,因此我使用静态 Thread.setDefaultUncaughtExceptionHandler 方法来设置它。

@Configuration
public class Config {

@Bean
public JvmrtExceptionHandler jvmrtExceptionHandler() {
JvmrtExceptionHandler exceptionHandler = new JvmrtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(exceptionHandler);
return exceptionHandler;
}
}

我正在使用以下代码测试处理程序。

@RestController
@RequestMapping(value = "/test")
public class ExceptionTest {

@RequestMapping(value = "/exception", method = RequestMethod.GET)
public void throwException() {
throw new RuntimeException();
}

}

我做错了什么?真的很让我头疼,任何帮助将不胜感激。

最佳答案

因为您的RuntimeException被嵌入的tomcat捕获。您可以在org.apache.catalina.core.StandardWrapperValve.invoke中找到try catch>。它打印完整的异常消息,并将错误放入响应中。

如果你想在Spring请求映射中捕获异常,你可以尝试ControllerAdviceExceptionHandler

关于java - Spring Boot 应用程序中未调用 Thread.setDefaultUncaughtExceptionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35564177/

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