Lorsque nous développons des applications Web Spring, pour vérifier les exceptions telles que IOException et ClassNotFoundException , le compilateur invite souvent le programmeur à utiliser try-catch pour une capture explicite. Pour les exceptions non-chéries telles que ClassCastException et NullPointerException , le compilateur ne vous invitera pas, ce qui est souvent un aspect qui reflète la capacité d'écriture de code du programmeur.
Dans Spring Web, en particulier les applications de Spring-Boot, lorsqu'une demande est appelée avec succès, il renverra généralement un objet au format json , comme indiqué sur la figure ci-dessous:
Mais que se passe-t-il si la demande jette une RuntimeException ? Si nous ne faisons pas le traitement, la page suivante apparaîtra lorsque nous rappelons:
C'est-à-dire que lorsqu'une erreur se produit dans l'appel, Spring-Boot mappera la demande sur le chemin /error par défaut. S'il n'y a pas de processeur de demande de chemin correspondant, il reviendra à la page d'erreur Whitelabel ci-dessus.
1. Personnalisez la page de gestion des erreurs
Bien sûr, il est impossible de ne pas traiter les exceptions d'exécution! La pratique habituelle consiste à personnaliser la page d'erreur unifiée, puis à revenir. Selon l'idée ci-dessus, nous implémentons un contrôleur avec un chemin de demande de /error . Le contrôleur renvoie une adresse de chemin de ressource, définit un contrôleur avec un chemin de carte de demande de /error et implémente l'interface ErrorController . Le code est le suivant:
MyErrorPageController
package com.example.demo.controller.handler.errorpage; import org.springframework.boot.web.servlet.error.errorcontroller; import org.springframework.sterreotype.controller; import org.springframework.web.bind.annotation.requestMapping; / ** * la classe MyErrorPageController. * * Description: Page d'erreur personnalisée * * @Author: HuangJiAwei * @Since: 13 juin 2018 * @version: $ révision $ $ date $ $ LastChangedBy $ * * / @ ControllerPublic class MyerrorPageController implémente ErrorController. // Cette ressource est située dans le répertoire des ressources / statique} @Override public String getErrorPath () {return null; }} Créez ensuite le fichier error.html dans reosurces/static :
<! Doctype html> <html> <éad- head> <meta charset = "utf-8"> <ititle> Insérez le titre ici </title> </ head> <body> <h1> Ceci est une page d'erreur! Stocké dans les ressources / répertoire statique. L'appel par défaut se trouve dans l'erreur Spring-Boot </H1> </body> </html>
Demande http://localhost:7000/demo/getUserInfoWithNoHandler.json à nouveau, comme suit:
@ControllerAdvice , @ResponseBody et @ExceptionHandler pour gérer les exceptions uniformément
Au printemps, les trois annotations ci-dessus peuvent être utilisées pour la manipulation des exceptions unifiées. Par défaut, nous pouvons définir un gestionnaire de processeur unifié pour certains types d'exceptions qui apparaissent dans le système. Par exemple, si le système lance une NullPointerException , alors nous pouvons définir un processeur spécifiquement pour NullPointerException . Le code est le suivant:
Interface getUserInfoWithNullPointerException
/ ** * Test de la gestion des erreurs de pointeur null * @return * @throws nullpointerException * / @ requestmapping (value = "getUserInfowithnullpointerException.json", méthode = requestMethod.get) public getuserinfowithnullpointerexception ();
NullPointerExceptionHandler.java
package com.example.demo.controller.handler; import org.springframework.web.bind.annotation.controlleradvice; import org.springframework.web.bind.annotation.exceptionhandler; import com.example.demo.pojo.errorreturn; / ** * * La classe nullpointerExceptionHandler. * * Description: Gérer les pointeurs nuls * * @Author: HuangJiawei * @Since: 13 juin 2018 * @version: $ révision $ $ date $ $ lastchangedBy $ * * / @ CONTRILERADVIBLIC Class NullPointerExceptionHandler {@ExceptionHandler (nullpointerException.class) @RessageBody Public ErrorTrEnral e.printStackTrace (); ErrorRetTr error = new errorTurn (); error.SetReturnCode ("- 1"); error.setDesc ("Exception du pointeur nul s'est produite!"); Erreur de retour; }} Exécution du navigateur: http://localhost:7000/demo/getUserInfoWithNullPointerException.json
De la même manière, si nous devons fournir un processeur unifié pour d'autres exceptions d'exécution, nous pouvons également définir un processeur pour chaque type d'exception comme ci-dessus. Par exemple, si nous voulons définir un processeur pour ArithmeticException , nous avons seulement besoin de créer une classe ou une méthode, puis ajouter ArithmeticException.class à l'annotation @ExceptionHanler sur la méthode pour spécifier le type d'exception.
Cependant, avez-vous constaté que de cette façon, définit une classe ou une méthode de gestion d'exception pour chaque type d'exception. Étant donné qu'il existe de nombreux types d'exceptions lors de l'exécution, il est impossible de spécifier une classe de processeur ou une méthode pour chaque type. Dans ce cas, le printemps peut également le résoudre. Si nous ne définissons pas de processeur pour un certain type d'exception, tels que ArithmeticException , alors nous pouvons définir une Exception ou un processeur Throwable pour le gérer uniformément.
L'avantage de le faire est qu'il réduit le nombre de classes de processeurs et transfère la gestion des exceptions à la classe parent, ce qui est également un avantage majeur de l'héritage! Cependant, lorsque vous définissez un processeur d'un type d'exception spécifique et d'une Exception en même temps, soyez prudent, il n'y a pas nécessairement une relation prioritaire ici, c'est-à-dire qu'il peut ne pas nécessairement se produire que seul le processeur d'exception parent est exécuté. Il ne peut exécuter que le processeur A, pas seulement le processeur B, ou seulement le processeur B, pas le processeur A. Par exemple, l'exception NullPointerExceptionHandler sera transmise à Exception (mais ArithmeticException ne sera pas transmise à Exception )
Supposons maintenant que nous définissons à la fois NullPointerExceptionHandler ci-dessus et ExceptionThrowableHandler ci-dessous. Ensuite, lorsqu'une NullPointerException se produit, ExceptionThrowableHandler sera exécutée par défaut.
ExceptionThrowableHandler.java
package com.example.demo.controller.handler; import org.springframework.web.bind.annotation.controlleradvice; import org.springframework.web.bind.annotation.exceptionhandler; import com.example.demo.pojo.errorreturn; / ** * * La classe expenshrowableHandler. * * Description: Certaines exceptions sont transmises à des exceptions de haut niveau (mais Arithmeticexception ne sera pas transmise à l'exception) * * @author: HuangJiawawei * @Since: 13 juin 2018 * @version: $ révision $ datt $ $ lastchangedBy $ * * / @ contrôleraDvicePublic ClassThrowableMandable {@ExceptionHandler (thorderable. ErrorReturn dealthrowable () {errorRetTr error = new errorRetTer (); error.setDesc ("Handle Throwable!"); error.SetReturnCode ("- 1"); Erreur de retour; } @ExceptionHandler (exception.class) @ResponseBody public ErrorReturn DealComMonexception () {errorRetUrn error = new errorRetturn (); error.SetReturnCode ("- 1"); error.setDesc ("Gestion des exceptions publiques!"); Erreur de retour; }} Exécution du navigateur: http://localhost:7000/demo/getUserInfoWithNullPointerException.json
On peut constater que le processeur qui exécute uniquement Exception mais n'exécute pas de pointeur nul, c'est-à-dire que le traitement des exceptions est transmis vers le haut. Jetons un coup d'œil à la situation où ArithmeticException est lancée:
getUserInfoWithArithmeticException.json
/ ** * Test de la gestion des erreurs de pointeur nuls * @return * @throws nullpointerException * / @ requestmapping (value = "getUserInfowitharithmeticexception.json", méthode = requestMethod.get) public getUserIrfowitharithmeticexception () lance arithmeticexception {throw new arithMeticexception ();} ArithmeticExceptionHandler.java
package com.example.demo.controller.handler; import org.springframework.web.bind.annotation.controlleradvice; import org.springframework.web.bind.annotation.exceptionhandler; import com.example.demo.pojo.errorreturn; @ControlleRADVIBLIC Classe ArithMeticexceptionHandler {/ ** * Gire Arithmeticexceptionxception Exception * @return * / @ResponseBody @ExceptionHandler (arithMeticexception.class) public ErrorReturn DeFFAYMeTiTException () {errorReTrUltrEl. errorObject.SetReturnCode ("- 1"); errorObject.setDesc ("Exception s'est produite dans le traitement arithmétique!"); return errorObject; }} Exécution du navigateur: http://localhost:7000/demo/getUserInfoWithArithmeticException.json
En conséquence, il a été constaté que la manipulation des exceptions n'était pas transmise à ExceptionHandler au niveau supérieur.
Résumé: Soyez particulièrement prudent lors de la définition des processeurs de types spécifiques et de types de parents tels que Exception . Toutes les exceptions ne seront pas traitées au niveau supérieur. Si nous voulons seulement réduire le nombre de classes de processeurs et ne voulons pas ajouter de classes ou de méthodes pour chaque type de processeur spécifique, l'éditeur recommande d'utiliser instanceof pour juger le type d'exception.
Comme dans le code suivant, nous établissons uniquement un gestionnaire d'exceptions du public, gérons les exceptions Exception et utilisons instanceof de faire des jugements.
@ExceptionHandler (exception.class) @ResponseBodyPublic errorReturn DealComMonexception (exception e) {errorReturn error = new errorRetturn (); // Ici, vous pouvez utiliser l'instance de déterminer le type d'exception if (e instanceof arithmeticexception) {error.SetReturnCode ("- 1"); error.setDesc ("ArithMeticexception Maniption!"); Erreur de retour; } System.err.println ("Exception"); error.SetReturnCode ("- 1"); error.setDesc ("Gestion des exceptions publiques!"); Erreur de retour;} Le navigateur exécute l'interface qui lève ArithmeticException , comme suit:
L'adresse du code de cet article: https://github.com/smallercoder/spring_exceptionhandler
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.