Ketika kami mengembangkan aplikasi web Spring, untuk memeriksa pengecualian seperti IOException dan ClassNotFoundException , kompiler sering meminta programmer untuk menggunakan try-catch untuk penangkapan eksplisit. Untuk pengecualian non-periksa seperti ClassCastException dan NullPointerException , kompiler tidak akan meminta Anda, yang sering merupakan aspek yang mencerminkan kemampuan menulis kode programmer.
Di Spring Web, terutama aplikasi Spring-Boot, ketika permintaan berhasil, umumnya akan mengembalikan objek dalam format json , seperti yang ditunjukkan pada gambar di bawah ini:
Tetapi bagaimana jika permintaan itu melempar RuntimeException ? Jika kami tidak melakukan pemrosesan, halaman berikut akan muncul ketika kami menelepon lagi:
Artinya, ketika kesalahan terjadi pada panggilan, boot-spring akan memetakan permintaan ke jalur /error secara default. Jika tidak ada prosesor permintaan jalur yang sesuai, itu akan kembali ke halaman kesalahan Whitelabel di atas.
1. Kustomisasi halaman penanganan kesalahan
Tentu saja, tidak mungkin untuk tidak memproses pengecualian runtime! Praktik yang biasa adalah untuk menyesuaikan halaman kesalahan terpadu dan kemudian kembali. Menurut ide di atas, kami mengimplementasikan pengontrol dengan jalur permintaan /error . Pengontrol mengembalikan alamat jalur sumber daya, mendefinisikan pengontrol dengan jalur peta permintaan /error dan mengimplementasikan antarmuka ErrorController . Kodenya adalah sebagai berikut:
MyErrorPageController
Paket com.example.demo.controller.handler.errorpage; impor org.springframework.boot.web.servlet.error.errorcontroller; impor org.springframework.stereotype.controller; Impor org.springframework.web MyErrorPageController. * * Description:Custom Error Page* * @author: huangjiawei * @since: June 13, 2018* @version: $Revision$ $Date$ $LastChangedBy$ * */@Controllerpublic class MyErrorPageController implements ErrorController { @RequestMapping("/error") public String handleError() { return "error.html"; // Sumber daya ini terletak di Direktori Sumber Daya/Statis} @Override Public String getErrorPath () {return null; }} Kemudian buat file error.html di direktori reosurces/static :
<! Doctype html> <html> <head> <meta charset = "UTF-8"> <Title> Masukkan judul di sini </iteme> </head> <hody> <h1> Ini adalah halaman kesalahan! Disimpan di Direktori Sumber Daya/Statis. Panggilan default ada dalam kesalahan boot-boot </h1> </body> </html>
Minta http://localhost:7000/demo/getUserInfoWithNoHandler.json lagi, sebagai berikut:
@ControllerAdvice , @ResponseBody , dan @ExceptionHandler untuk menangani pengecualian secara seragam
Di musim semi, tiga anotasi di atas dapat digunakan untuk penanganan pengecualian terpadu. Secara default, kita dapat mendefinisikan penangan prosesor terpadu untuk jenis pengecualian tertentu yang muncul dalam sistem. Misalnya, jika sistem melempar NullPointerException , maka kita dapat mendefinisikan prosesor khusus untuk NullPointerException . Kodenya adalah sebagai berikut:
getUserInfoWithNullPointerException Interface
/** * Testing the handling of null pointer errors* @return * @throws NullPointerException */@RequestMapping(value = "getUserInfoWithNullPointerException.json", method = RequestMethod.GET)public Student getUserInfoWithNullPointerException() throws NullPointerException {throw new NullPointerException();} NullPointerExceptionHandler.java
Paket com.example.demo.controller.handler; impor org.springframework.web.bind.annotation.controllerAdvice; impor org.springframework.web.bind.annotation.exceptionHandler; Impor org.spramework.web.bind.annotation.respones.responesy com.example.demo.pojo.errorreturn;/** * * Kelas nullpointerExceptionHandler. * * Description: Handle null pointer* * @author: huangjiawei * @since: June 13, 2018* @version: $Revision$ $Date$ $LastChangedBy$ * */@ControllerAdvicepublic class NullPointerExceptionHandler { @ExceptionHandler(NullPointerException.class) @ResponseBody public ErrorReturn dealNullPointerException() { e.printstacktrace (); Errorreturn error = new errorreturn (); error.setReturnCode ("-1"); error.setdesc ("Pengecualian pointer null terjadi!"); kesalahan pengembalian; }} Eksekusi browser: http://localhost:7000/demo/getUserInfoWithNullPointerException.json
Dengan cara yang sama, jika kita perlu menyediakan prosesor terpadu untuk pengecualian runtime lainnya, kita juga dapat menentukan prosesor untuk setiap jenis pengecualian seperti di atas. Misalnya, jika kita ingin mendefinisikan prosesor untuk ArithmeticException , maka kita hanya perlu membuat kelas atau metode, dan kemudian menambahkan ArithmeticException.class ke anotasi @ExceptionHanler pada metode untuk menentukan jenis pengecualian.
Namun, pernahkah Anda menemukan bahwa dengan cara ini, mendefinisikan kelas penanganan pengecualian atau metode untuk setiap jenis pengecualian. Karena ada banyak jenis pengecualian saat runtime, tidak mungkin untuk menentukan kelas prosesor atau metode untuk setiap jenis. Dalam hal ini, musim semi juga dapat menyelesaikannya. Jika kita tidak mendefinisikan prosesor untuk jenis pengecualian tertentu, seperti ArithmeticException , maka kita dapat menentukan Exception atau prosesor Throwable untuk menanganinya secara seragam.
Keuntungan melakukan ini adalah bahwa ia mengurangi jumlah kelas prosesor dan mentransfer penanganan pengecualian ke kelas induk, yang juga merupakan keuntungan utama dari pewarisan! Namun, ketika Anda mendefinisikan prosesor dari jenis pengecualian tertentu dan Exception pada saat yang sama, hati -hati, tidak harus ada hubungan prioritas di sini, yaitu, mungkin tidak selalu terjadi bahwa hanya prosesor pengecualian orang tua yang dieksekusi. Ini hanya dapat menjalankan prosesor A, tidak hanya prosesor B, atau hanya prosesor B, bukan prosesor A. Misalnya, pengecualian NullPointerExceptionHandler akan diteruskan ke Exception (tetapi ArithmeticException tidak akan diteruskan ke Exception )
Sekarang anggaplah kita mendefinisikan baik NullPointerExceptionHandler di atas dan ExceptionThrowableHandler di bawah ini. Kemudian ketika NullPointerException terjadi, metode ExceptionThrowableHandler akan dieksekusi secara default.
ExceptionThrowableHandler.java
Paket com.example.demo.controller.handler; impor org.springframework.web.bind.annotation.controllerAdvice; impor org.springframework.web.bind.annotation.exceptionHandler; Impor org.spramework.web.bind.annotation.respones.responesy com.example.demo.pojo.errorreturn;/** * * Kelas ExceptionThrowableHandler. * * Deskripsi: Beberapa pengecualian diteruskan ke pengecualian tingkat tinggi (tetapi arithmeticException tidak akan ditransmisikan ke pengecualian) * * @author: huangjiawei * @since: 13 Juni 2018 * @version: $ revisi $ $ lastChandby $ */ @controllerAdviceplic Classcrowablic classcrowableDy ClassionShrowabley {controllerAdviceplic Classcrowablic ClassthrowableDy {controllerAdviceplic Classcrowablic Classthrowablic ClassthrowableDy {controllerAdviceplic Classthrowablic ClassthrowableDy Public ErrorReturn dealthrowable () {errorreturn error = new errorreturn (); error.setDesc ("Tangani Throwable!"); error.setReturnCode ("-1"); kesalahan pengembalian; } @ExceptionHandler (Exception.class) @ResponseBody Public ErrorReturn dealCommonexception () {errorreturn error = new errorreturn (); error.setReturnCode ("-1"); error.setdesc ("Penanganan Pengecualian Publik!"); kesalahan pengembalian; }} Eksekusi browser: http://localhost:7000/demo/getUserInfoWithNullPointerException.json
Dapat ditemukan bahwa prosesor yang hanya menjalankan Exception tetapi tidak menjalankan pointer nol, yaitu, pemrosesan pengecualian ditransmisikan ke atas. Mari kita lihat situasi di mana ArithmeticException dilemparkan:
getUserInfoWithArithmeticException.json
/** * Testing the handling of null pointer errors* @return * @throws NullPointerException */@RequestMapping(value = "getUserInfoWithArithmeticException.json", method = RequestMethod.GET)public Student getUserInfoWithArithmeticException() throws ArithmeticException {throw new ArithmeticException();} ArithmeticExceptionHandler.java
Paket com.example.demo.controller.handler; impor org.springframework.web.bind.annotation.controllerAdvice; impor org.springframework.web.bind.annotation.exceptionHandler; Impor org.spramework.web.bind.annotation.respones.responesy com.example.demo.pojo.errorreturn; @controllerAdvicepublic kelas arithmeticexceptionHandler { / *** menangani arithmeticeCceptionException Exception* @return* / @responseBody @excepticceptEcception (ArithMetICException.classurn) @responsody @excepticceptEcceptEcception* Errorreturn (); errorObject.setReturnCode ("-1"); errorObject.setDesc ("Pengecualian terjadi dalam pemrosesan aritmatika!"); return errorObject; }} Eksekusi browser: http://localhost:7000/demo/getUserInfoWithArithmeticException.json
Akibatnya, ditemukan bahwa penanganan pengecualian tidak ditransmisikan ke ExceptionHandler di tingkat atas.
Ringkasan: Berhati -hatilah saat mendefinisikan prosesor dari jenis spesifik dan tipe orang tua seperti Exception . Tidak semua pengecualian akan diproses di tingkat atas. Jika kami hanya ingin mengurangi jumlah kelas prosesor dan tidak ingin menambahkan kelas atau metode untuk setiap jenis prosesor tertentu, maka editor merekomendasikan menggunakan kata kunci instanceof untuk menilai jenis pengecualian.
Seperti dalam kode berikut, kami hanya membuat penangan pengecualian publik, menangani pengecualian Exception , dan menggunakan instanceof untuk membuat penilaian.
@ExceptionHandler (Exception.class) @ResponseBodyPublic errorReturn dealCommonexception (Exception e) {errorreturn error = new errorreturn (); // Di sini Anda dapat menggunakan instanceof untuk menentukan tipe pengecualian jika (e instance dari arithmeticException) {error.setReturnCode ("-1"); error.setdesc ("penanganan arithmeticException!"); kesalahan pengembalian; } System.err.println ("Exception"); error.setReturnCode ("-1"); error.setdesc ("Penanganan Pengecualian Publik!"); mengembalikan kesalahan;} Browser mengeksekusi antarmuka yang melempar ArithmeticException , sebagai berikut:
Alamat kode artikel ini: https://github.com/smallercoder/spring_exceptionhandler
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.