2011-11-18 54 views
3

我想在SpringMVC3中使用帶註釋的「@ExceptionHandler」來捕捉「錯誤」。我可以捕獲throwable和任何異常,但是當我嘗試使用「Error」時,它沒有捕獲異常。任何想法爲什麼?下面的代碼演示了這個問題。即使明確拋出錯誤,爲什麼錯誤沒有被捕獲?

@Controller 
@RequestMapping("/test") 
public class TestExceptionController { 

static final Logger logger = Logger.getLogger(TestExceptionController.class); 

    @RequestMapping(method = RequestMethod.GET) 
    public String processData(int intValue) throws InvalidDataException { 

     if (intValue < 6) { 
      try { 
       throw new Exception(); 
      } catch (Exception e) { 
       throw new InvalidDataException(); 
      } 
     } 

     return "test"; 

    } 

    @ExceptionHandler(InvalidDataException.class) 
    public ModelMap handleException(InvalidDataException ex) { 
     logger.debug("exception catched :" + ex); 

     return new ModelMap(); 

    } 
} 

上面的代碼捕獲,但下面的代碼不捕獲。爲什麼它沒有捕捉到錯誤?

@Controller 
@RequestMapping("/test") 
public class TestExceptionController { 

    static final Logger logger = Logger.getLogger(TestExceptionController.class); 

    @RequestMapping(method = RequestMethod.GET) 
    public String processData(int intValue) throws Error{ 

     if (intValue < 6) { 
      try { 
       throw new Exception(); 
      } catch (Exception e) { 

       throw new Error(); 
      } 
     } 
     return "test"; 

    } 

    @ExceptionHandler(Error.class) 
    public ModelMap handleException(Error ex) { 
     logger.debug("exception catched :" + ex); 

     return new ModelMap(); 

    } 
} 
+2

未來,請編輯您現有的問題,而不是創建一個新的問題。我已經投票結束了原文。 –

+0

您使用的是哪個版本的Spring3? – andyb

+0

這是否回答了您的問題:http://stackoverflow.com/questions/8184593/why-error-is-not-getting-caught-even-when-explicitly-thrown/8212177#8212177 –

回答

-2

沒有打算處理異常而不是錯誤?錯誤在Java中非常嚴格地使用,並且有很少的實現類。

+0

斷言是一個很好的例子錯誤。當我們更換一個jar而不更新其他jar時,我們也看到了一些生產中的類鏈接錯誤。 – Gray

+0

@Gray我不是說沒有有效的情況來處理錯誤,我只是說它不是太常見。此外,調試消息指出「異常捕獲」,異常處理程序方法稱爲handleException。如果他真的對Error感興趣,那麼它應該是「錯誤捕捉」和handleError? –

-1

對我來說,下面春的作品3.0.5 MVC

@ResponseStatus(HttpStatus.NOT_FOUND) 
public class NotFoundException extends RuntimeException{ 
    public NotFoundException() { 
     super(); 
    } 
} 

@ExceptionHandler 
    @RequestMapping(method = RequestMethod.GET, value = "employee/{id}", 
      headers = "Accept=application/json,application/x-protobuf,application/xml") 
    public @ResponseBody method(xxxx) 
{ 
.. 
throw new NotFoundException 
... 
} 
+0

這與處理'Error'(不是'Exception')有什麼關係? –

4

其實我看着春天的DispatcherServlet的來源和線809它解釋了爲什麼錯誤無法處理

 catch (Exception ex) { 
      Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null); 
      mv = processHandlerException(processedRequest, response, handler, ex); 
      errorView = (mv != null); 
     } 

的代碼是彈簧處理ExceptionResolvers可能是註釋或基於bean的部分。你可以看到Spring只會憎惡Exception not Throwable。錯誤不是Exception的子類,而是可拋出的,所以你不能用這種方式處理它。在相關的註釋中,註釋也被稱爲@ExceptionHandler,所以它暗示它不適用於錯誤。

0

我也崩潰了,從@ peter-szanto粘貼的代碼看起來似乎沒有辦法用Spring註冊的處理程序來處理java.lang.Error。我的用例是處理本地化頁面的錯誤,並記錄錯誤。我的解決方法是將web.xml與錯誤頁面/錯誤代碼500一起定義,並將錯誤頁面/位置用作Spring處理的控制器(而不是JSP)以獲得本地化工作。缺點是當控制器代碼運行時,沒有對當前用戶進行認證。這也捕獲了Spring不可能處理的事情,就像錯誤的URI沒有映射到Spring。

1

Error的javadoc:

一個錯誤是Throwable的子類,表示嚴重的問題 合理的應用程序不應該試圖捕獲。大多數這樣的 錯誤都是異常情況。 ThreadDeath錯誤雖然是 「正常」條件,但也是Error的一個子類,因爲大多數 應用程序不應該試圖捕獲它。

捕獲一個錯誤(或任何其他不是異常的子類的Throwable)是一個壞主意。春天不支持它是正確的。

+1

我**完全不同意**,聲明「Spring不支持它正在做正確的事情」。正如前面提到的Javadocs,*大多數應用程序不應該試圖捕獲錯誤*,但這實際上意味着**有這些應該被捕獲的合理情況**,所以Spring根本不支持邊界情況。 **這種**合理的情況的一個簡單的**例子就是這種例外的基本日誌記錄**,而且這種情況目前不可能使用Spring,因此我將其看作是**的一個**體系結構缺陷。 – Yura

+0

在運行時可能發生並且應該記錄的錯誤的另一個例子是** UnsatisfiedLinkError ** - https://docs.oracle.com/javase/7/docs/api/java/lang/UnsatisfiedLinkError.html,哪些**只能在運行時檢測到**和**應該被正確記錄**。這個錯誤通常不會導致整個JVM的崩潰,而是會影響使用動態庫的部分功能,並且是爲記錄目的應該捕獲的錯誤的完美示例,以及Web應用程序繼續工作之後的錯誤一般。 – Yura

相關問題