我正在尝试在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请求映射中捕获异常,则可以尝试 ControllerAdvice 和 ExceptionHandler 。