这与如何在Spring MVC或任何其他方式中处理异常无关。我特别需要处理可能在 spring启动期间发生的异常,即在整个应用程序上下文尚未初始化之前。
从某种程度上讲,有问题的应用程序是一个IoT节点,它允许远程访问电子设备。它内置了一个小的h2数据库来保留一些数据。这些数据有时会很好用,但对于应用程序正常工作并不是真正必要的。
碰巧的是,正在运行应用程序的设备会偶尔断电,如果在对数据库进行写操作时发生断电,则文件已损坏,并且将发生JdbcSQLException当应用程序尝试再次启动时抛出。 由于数据并不是真正必需的,因此使应用程序再次运行的最简单方法是删除数据库,然后让h2重新创建它。但是,为了做到这一点,我必须捕获异常,以便对此做出反应。该应用程序不必不必继续启动,它将由systemd再次启动。我真的只需要确定异常并删除文件即可。
有一种显而易见的方法,就是将SpringApplication.run放在try-catch块中。但这也确实很丑陋,因为我得到的异常是我正在寻找的嵌套在由h2启动失败引起的成千上万的春季异常中。
还建议我在实例化数据库的Bean中捕获异常,但不幸的是,没有实例化数据库的Bean。该数据库用作Quartz作业存储,因此由Spring完全管理。它在代码中的完整存在是属性文件中的以下条目:
spring.quartz.job-store-type=jdbc
spring.quartz.properties.org.quartz.jobStore.misfireThreshold=900000
spring.datasource.name=h2
spring.datasource.url=jdbc:h2:file:${config.folder}controller
spring.datasource.driverClassName=org.h2.Driver
我的问题是,有什么方法可以注册某种异常处理程序或其他方式,以便在异常发生时,更容易识别时直接处理异常?