1. การจำแนกความผิดปกติ
ข้อยกเว้น Java แบ่งออกเป็นสองประเภท: "ตรวจสอบ" และ "ไม่ตรวจสอบ" คำว่า "ตรวจสอบ" หมายความว่าเมื่อรวบรวมรหัสคอมไพเลอร์จะตรวจสอบว่ามีการจัดการข้อยกเว้นใด ๆ (จับหรือโยนขึ้น) สำหรับข้อยกเว้นที่จัดว่าจำเป็นต้องตรวจสอบหากไม่ได้ดำเนินการการรวบรวมจะไม่สามารถส่งผ่านได้
เมื่อฉันเป็นผู้เริ่มต้นฉันมักจะสงสัยว่าทำไมข้อยกเว้นควรได้รับการจัดการด้วยวิธีนี้? ต่อมาฉันเข้าใจเล็กน้อยมีความผิดปกติเพียงสองประเภทเท่านั้น: อัตนัยและวัตถุประสงค์ สามารถหลีกเลี่ยงได้ในกรณีส่วนใหญ่และอีกกรณีหนึ่งไม่สามารถหลีกเลี่ยงได้ในกรณีส่วนใหญ่
ข้อยกเว้นเช่น nullpointerexception ส่วนใหญ่เชื่อมโยงกับคุณภาพของโปรแกรมเมอร์ (พัฒนาและทดสอบอย่างดีพวกเขาจะไม่ปรากฏขึ้นหลังจากระบบทำงาน) พวกเขาสามารถหลีกเลี่ยงได้โดยทั่วไป ไวยากรณ์ Java ใช้พวกเขาในชั้นเรียนเป็น "ข้อยกเว้นที่ไม่ใช่การตรวจสอบ" ซึ่งช่วยโปรแกรมเมอร์และคอมไพเลอร์ได้อย่างมาก
ข้อยกเว้นที่เกี่ยวข้องกับสภาพแวดล้อมภายนอกเช่น IOException เกือบจะหลีกเลี่ยงไม่ได้ (เครือข่ายจะวางสายในวันหนึ่งและอื่น ๆ ) อย่างไรก็ตามเมื่อพบโดยไม่คาดคิดโปรแกรมยังคงต้องสร้างความแตกต่างดังนั้นคอมไพเลอร์จำเป็นต้องกระตุ้นให้โปรแกรมเมอร์ตรวจสอบและดูว่ามีการจัดการข้อยกเว้นที่ไม่คาดคิดที่เป็นไปได้เหล่านี้หรือไม่ เมื่อวัตถุข้อยกเว้นถูกส่งผ่านไปยังโหนดโปรแกรมสามารถดำเนินการบางอย่างเช่น: ส่งคืนพรอมต์ให้กับผู้ใช้ ("ระบบไม่ว่างโปรดลองอีกครั้ง") กดข้อความข้อยกเว้นไปยังแพลตฟอร์มการตรวจสอบ ฯลฯ
2. การประมวลผลผลตอบแทนแบบครบวงจรของข้อยกเว้น
1. การประมวลผลคอนเทนเนอร์
รายการต่อไปนี้แสดงวิธีการประมวลผลของ TOMCAT กำหนดค่าภายใต้ web.xml และจัดการตามรหัสส่งคืน HTTP หรือประเภทข้อยกเว้น:
<Rorrer-Page> <Srorror-Code> 404 </error-Code> <location> /web-inf/views/error/404.jsp </location> </errors-page> <rorrors-page> <rerors-page> <Exception-ype> java.lang.-hrowable </exception-type> <clection>/web-inf/views/error/throwable.jsp </location>
ข้อเสีย: ไม่สามารถจัดการคำขอที่ไม่จำเป็นต้องส่งคืน HTML เช่น AJAX;
2. การประมวลผลเฟรมเวิร์ก
รายการต่อไปนี้แสดงวิธีการประมวลผลของสปริง MVC
(1) ใช้ SimpleMappingExceptionResolver ตัวจัดการข้อยกเว้นง่าย ๆ ที่รวมอยู่ในสปริง MVC;
(2) ใช้อินเตอร์เฟส HandlerexceptionResolver Handler Exception Custom; (ขอแนะนำให้ใช้และสามารถรองรับ Ajax และส่วนขยายอื่น ๆ )
(3) ใช้คำอธิบายประกอบ @ExceptionHandler เพื่อใช้การจัดการข้อยกเว้น
พิมพ์ (1) กำหนดค่าภายใต้ Spring-MVC.XML
<!-ไปที่ข้อยกเว้นที่ถูกส่งโดยคอนโทรลเลอร์ไปยังมุมมองเฉพาะ-> <bean> <property name = "ExceptionMappings"> <props> <!-ข้อยกเว้นที่แตกต่างกันกระโดดแยกกัน-> <!-คุณสามารถปรับแต่งข้อยกเว้นที่แตกต่างกัน-> <prop key = "com.test.myexception1">/e1 </ ไม่ต้องการปรับแต่งข้อยกเว้นเพียงกำหนดค่าต่อไปนี้ -> <prop key = "java.lang.-hrowable">/ข้อผิดพลาด/500 </prop> </props> </porement> </ebean>
ข้อเสีย: ไม่สามารถจัดการคำขอที่ไม่จำเป็นต้องส่งคืน HTML;
พิมพ์ (2) คลาสการใช้งานของอินเตอร์เฟส handlerexceptionResolver ที่กำหนดเอง
/** * ตัวจัดการข้อยกเว้นที่กำหนดเอง: รองรับ ajax * @author wangxu * */คลาสสาธารณะ MyExceptionHandler ใช้ handlerexceptionResolver {โมเดลสาธารณะ ResolveException (httpservletRequest Request request.getheader ("x-requested-with")! = null && "xmlhttprequest" .equals (คำขอ. -getheader ("x-requested-with"). toString ()); if (! isajax) {if (ex instanceof com.test.myexception1) {ส่งคืน modelandview ใหม่ ("/ข้อผิดพลาด/e1"); } else if (ex instanceof com.test.myexception1) {ส่งคืน modelandview ใหม่ ("/error/e2"); } else {ส่งคืน modelandview ใหม่ ("/ข้อผิดพลาด/500"); }} สตริง jsonRes = "{/" ข้อความ/":/" " +" ข้อยกเว้นระบบ " +"/"}"; // โครงสร้างที่กำหนดเอง ลอง {out = response.getWriter (); request.Setcharacterencoding ("UTF-8"); Response.SetContentType ("ข้อความ/ธรรมดา; charset = UTF-8"); out.print (jsonres); out.flush (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {out.close (); } return null; -และลงทะเบียนโปรเซสเซอร์ภายใต้ Spring-MVC.XML
<bean id = "ExceptionHandler"/>
ข้อดี: สามารถจัดการคำขอ AJAX และยังสะดวกสำหรับการเข้ารหัสเพื่อใช้ส่วนขยายการทำงานเช่นการตรวจสอบข้อยกเว้น ฯลฯ
พิมพ์ (3), @ExceptionHandler คำอธิบายประกอบ
@controllerpublic คลาส testexceptionhandlercontroller {@exceptionhandler ({myexception1.class}) ข้อยกเว้นสตริงสาธารณะ (myexception1 e) {return "/error/e1"; } @requestmapping ("/mary") การทดสอบโมฆะสาธารณะ () {โยน myexception1 ใหม่ ("ไม่มีเงิน!"); -ข้อเสีย: วิธีการของ @ExceptionHandler จะต้องอยู่ภายใต้คอนโทรลเลอร์เดียวกับวิธีการยกเว้นการขว้างปาที่เป็นไปได้ (ไม่แนะนำ)
3. การรวมกัน
ในโครงการจริงเมื่อจัดการผลตอบแทนที่เหมือนกันของข้อยกเว้นข้อยกเว้นหรือส่วนขยายที่กำหนดเองบางอย่างจะถูกส่งไปยังเฟรมเวิร์กและการแมปของรหัสส่งคืน HTTP จะถูกส่งไปยังคอนเทนเนอร์เนื่องจากรหัสส่งคืน HTTP นั้นอยู่ด้านนอก เฟรมเวิร์กทำงานในคอนเทนเนอร์ เมื่อเฟรมเวิร์กใช้ข้อยกเว้นก่อนและส่งคืนคอนเทนเนอร์จะไม่ถูกแมปอีกต่อไป
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน