2017-10-04 63 views
0

Java異常處理被細分爲Errors,checked exceptions和unchecked exceptions。這個問題是關於例外的。Java Spring引導微服務異常處理

正常的Java異常處理是爲了檢查異常而擴展Exception類,並根據需要通過考慮異常層次來處理它們。

例如爲:

public class ExceptionA extends Exception {} 

public class RunClass { 

    public static void main() { 
     try { 
      RunClass runClass = new RunClass(); 
      runClass.doSomething(); 
     } catch(ExceptionA eA) { 
      // Do ExceptionA related resolutions. 
     } catch(Exception e) { 
      // Do Exception related resolutions. 
     } 
    } 

    public doSomething() throws ExceptionA { 
     throw new ExceptionA(); 
    } 
} 

但是我看到主要的春天的書籍,甚至與Spring引導和微服務的上下文中提到上網教程總是從RuntimeException的類甚至與@ControllerAdvice延伸。

這明顯違反了Java異常處理的基礎知識。但是仍然有一種觀點認爲,它是用RuntimeException擴展的,因爲這個異常是由@ExceptionHandler方法處理的,並且它在運行時都會被生成和處理。

儘管如此,由於RuntimeException的這種擴展使編譯時異常處理跟蹤不可見,並且很難追溯如何拋出異常。由於這些原因,我仍然相信,使用@ExceptionHandler方法仍然遵循基本的Java檢查和未檢查的異常處理概念。

例如爲:

public class ExceptionRA extends RuntimeException {} 

@ContollerAdvice 
public class ExceptionHandler { 

    @ExceptionHandler(ExceptionRA.class) 
    public String handleException (Exception exception, Model model) { 
     return "exception"; 
    } 

} 

@Controller 
public class RunClass { 

    @RequestMapping("/url1") 
    public doSomething() { 
     throw new ExceptionRA(); 
    } 
} 

我應該遵循與@ExcpetionHadler所有的異常情況下的延伸的RuntimeException或遵循Java的檢查基本和unchecked機制@ExceptionHaldler?想法,建議和更正是受歡迎的。

+0

@lexocore:添加了問題 – Chinthaka

回答

2

選中/未選中的例外就像一個宗教。

您通常不會在您自己的代碼中調用控制器方法。通常你不會有這樣的代碼:

try { 
    runClass.doSomething(); 
} catch(ExceptionRA exra) { 
    // Handle handle handle 
} 

所以你不會直接從控制器方法檢查異常拋出獲利。他們不會強制任何檢查處理,因爲沒有地方可以處理它們。所以你可以拋出未經檢查的異常,並縮短方法簽名。從控制器方法中引發已檢查的異常沒有任何附加價值。

控制器正在調用的一些業務服務方法也可能拋出異常。這提出了兩個問題:

  • 應該在業務邏輯中使用checked或unchecked異常嗎?
  • 如果業務邏輯拋出檢查異常,是否應該將其封裝爲未經檢查的異常?或只是通過?

第一個問題的答案是 - 你不應該讓這個決定受到你在控制器中做什麼的影響。根據你的「異常宗教」來做。如果你喜歡檢查異常,使用檢查異常,不管你是否在控制器中使用未選中。

否第二個問題。假設您的業務邏輯拋出一個檢查的異常。如果這種例外情況足以代表調用者的情況,那麼沒有理由將其包含在任何其他異常中,無論是選中還是取消選中。如果您的業務異常不能正確地向調用者解釋情況,那麼最好包裝它。然後,未經檢查的異常將使您的簽名更短。

現在個人意見。除了編程錯誤之外,我通常更喜歡檢查異常。我也在控制器中使用它們(不要介意有些長期的方法簽名)。