2016-02-22 106 views
0

我試圖在Spring啓動應用程序中實現一個全局未捕獲的異常處理程序,該應用程序從一羣客戶端應用程序收集指標和異常等。看起來,處理程序正在設置,當我調試,所以我會假設或者另一個處理程序分配後我的代碼運行,或這些處理程序未設置在春季應用程序上下文?我的代碼如下。Thread.setDefaultUncaughtExceptionHandler在Spring Boot應用程序中沒有被調用

我創造了這個類我默認的異常處理 -

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(); 
     } 

} 

我在做什麼錯?真的在這裏敲我的頭,任何幫助將不勝感激。

回答

2

因爲你的RuntimeException被嵌入陷入tomcat.you可以org.apache.catalina.core.StandardWrapperValve.invoke找到嘗試捕捉。 它會打印完整的異常消息,並將錯誤置於響應中。

如果你想趕上春季請求例外mapping.you可以嘗試ControllerAdvice的ExceptionHandler

+0

瞭解它與ExceptionHandler一起工作。謝謝你的幫助。 –

相關問題