[英]RESTful Services - Avoid stacktrace to client
我正在使用Java開發一個寧靜的Web服務。 我正在處理所有運行時和其他可能的異常情況,以向客戶端發送有意義的響應。
當發生內存不足之類的問題時,如何確保客戶端從服務器獲得有意義的響應?
我正在使用CXF和ExceptionMapper。
在Spring中,您可以捕獲異常並將其映射到有意義的HTTP狀態代碼。 以下代碼可能對您YourException
(將YourException
映射到HTTP 500):
@ControllerAdvice
public class ExceptionProcessor {
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler({YourException.class})
public void serverError(HttpServletRequest req, Exception exception) {
// ...
// Print exception to server log
exception.printStackTrace();
}
}
這也不例外。 這是一個錯誤: java.lang.OutOfMemoryError
當它從Throwable
下降時,您可以捕獲它:
try {
// create lots of objects here and stash them somewhere
} catch (OutOfMemoryError E) {
// release some (all) of the above objects
}
但是,除非您要進行一些相當具體的工作(例如,在特定代碼段中分配大量工作),否則您可能將無法捕獲它,因為您將不知道它將從何處拋出。
如果問題的根本原因是內存泄漏,則從OOM進行捕獲和恢復可能不會回收泄漏的內存。 您的應用程序將繼續運行一段時間,然后一次又一次地進行OOM,並且每次間隔都越來越短。
當您專門分配可能太大的東西時,可能至少有一個好時機來捕獲OutOfMemoryError
:
OutOfMemoryError
的問題在於,它可能發生在任何線程中 ,包括未運行REST服務代碼的線程。 在服務器上下文中,捕獲任何Error
被認為是不好的做法。 您應該讓它冒泡,使調用堆棧由服務器代碼處理。
與其抓住原因,不如調查原因,以解決內存不足並修復原因的方法。 可能是服務器根本沒有分配足夠的內存,或者某處內存泄漏。 您需要分析問題,例如,通過分析生成的堆轉儲,並確保不再發生此問題。
在像Java EE服務器這樣的托管環境中,假設您可以通過捕獲它而從OutOfMemeoryory錯誤中恢復,這是危險的,並且通常是錯誤的。 通常,您甚至無法捕獲它,因為它發生在您無法控制的線程中。
我為此使用HandlerExceptionResolver:
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
@ExceptionHandler(value = Exception.class)
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
Your error processing goes here
}
}
因此,每個異常都進入resolveException,然后將適當的消息(在我的情況下為JSON)寫入響應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.