1. บทสรุป
การจัดการธุรกรรมของ Spring จะย้อนกลับข้อยกเว้นรันไทม์เท่านั้น (java.lang.RuntimeException และคลาสย่อย) ตามค่าเริ่มต้น
หากวิธีการส่งข้อยกเว้นหรือการตรวจสอบข้อยกเว้น การจัดการธุรกรรมของ Spring จะไม่ทำการย้อนกลับตามค่าเริ่มต้น
ข้อมูลเบื้องต้นโดยละเอียดเกี่ยวกับการจำแนกประเภทของข้อยกเว้น:
1. แนวคิดพื้นฐาน <BR>ดูแผนภาพโครงสร้างข้อยกเว้นของ Java
Throwable เป็นรากของข้อยกเว้นทั้งหมด java.lang.Throwable
ข้อผิดพลาดคือข้อผิดพลาด java.lang.Error
ข้อยกเว้นคือข้อยกเว้น java.lang.Exception
2.ข้อยกเว้น
โดยทั่วไปจะแบ่งออกเป็น Checkedข้อยกเว้นและข้อยกเว้นรันไทม์ อินสแตนซ์ทั้งหมดของคลาสRuntimeExceptionและคลาสย่อยเรียกว่าข้อยกเว้นรันไทม์ และข้อยกเว้นที่ไม่อยู่ในหมวดหมู่นี้เรียกว่าCheckedExceptions
1 ข้อยกเว้นที่ตรวจสอบ เฉพาะภาษา Java เท่านั้นที่มีข้อยกเว้นที่ตรวจสอบแล้ว Java ถือว่าข้อยกเว้นที่ตรวจสอบแล้วเป็นข้อยกเว้นที่สามารถจัดการได้ ดังนั้นโปรแกรม Java จะต้องจัดการข้อยกเว้นที่ตรวจสอบอย่างชัดเจน หากโปรแกรมไม่จัดการ CheckedException จะเกิดข้อผิดพลาดขึ้นเมื่อโปรแกรมถูกคอมไพล์และไม่สามารถคอมไพล์ได้ สิ่งนี้สะท้อนให้เห็นถึงปรัชญาการออกแบบของ Java: โค้ดที่ไม่มีการจัดการข้อผิดพลาดที่สมบูรณ์แบบจะไม่มีโอกาสถูกดำเนินการ มีสองวิธีในการจัดการกับข้อยกเว้นที่ตรวจสอบแล้ว
(1) หากวิธีการปัจจุบันรู้วิธีจัดการกับข้อยกเว้น ก็จะใช้ try...catch block เพื่อจัดการกับข้อยกเว้น
(2) หากวิธีการปัจจุบันไม่ทราบวิธีการจัดการ ให้ประกาศให้ส่งข้อยกเว้นเมื่อกำหนดวิธีการ
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ cn.xy.test;
นำเข้า java.io.IOException;
-
* ตรวจสอบวิธีการทดสอบข้อยกเว้น
* @ผู้เขียน xy
-
-
CheckedExceptionMethods คลาสสาธารณะ
-
//คลาสข้อยกเว้นทั้งหมดมีทั้ง checkException และ RuntimeException ดังนั้น checkException จะต้องได้รับการประมวลผล
โมฆะสาธารณะ method1() พ่นข้อยกเว้น
-
System.out.println("ฉันเป็นวิธีการของคลาสทั่วไปที่ส่งข้อยกเว้น");
-
//จับและจัดการข้อยกเว้นนี้
โมฆะสาธารณะ testMethod1_01()
-
พยายาม
-
วิธีที่ 1();
-
จับ (ยกเว้น e)
-
e.printStackTrace();
-
-
// ผ่านข้อยกเว้น
โมฆะสาธารณะ testMethod1_02() ส่งข้อยกเว้น
-
วิธีที่ 1();
-
โมฆะสาธารณะ testMethod1_03() พ่นข้อยกเว้น
-
โยนข้อยกเว้นใหม่ ();
-
โมฆะสาธารณะ testMethod1_04()
-
พยายาม
-
โยนข้อยกเว้นใหม่ ();
-
จับ (ยกเว้น e)
-
e.printStackTrace();
-
-
// โดยทั่วไปแล้ว checkException จะแสดงถึง IOException
โมฆะสาธารณะ method2() พ่น IOException
-
System.out.println("ฉันเป็นวิธีที่ส่งข้อยกเว้น IO");
-
โมฆะสาธารณะ testMethod2_01()
-
พยายาม
-
วิธีที่ 2();
-
จับ (ยกเว้น e)
-
e.printStackTrace();
-
-
โมฆะสาธารณะ testMethod2_02() ส่งข้อยกเว้น
-
วิธีที่ 2();
-
-
ข้อยกเว้นที่ตรวจสอบแล้วที่เราคุ้นเคยมากกว่านั้นได้แก่
Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IOException
②RuntimeException
ในรันไทม์ หากตัวหารเป็น 0 หรือตัวห้อยอาร์เรย์อยู่นอกขอบเขต ฯลฯ สิ่งเหล่านี้จะเกิดขึ้นบ่อยครั้งและยุ่งยากในการจัดการ การแสดงการประกาศหรือการบันทึกจะมีผลกระทบอย่างมากต่อความสามารถในการอ่านและประสิทธิภาพการทำงานของโปรแกรม ดังนั้นระบบจะตรวจจับสิ่งเหล่านั้นโดยอัตโนมัติและส่งมอบให้กับตัวจัดการข้อยกเว้นเริ่มต้น แน่นอน คุณยังสามารถจับภาพได้อย่างชัดเจนหากคุณมีข้อกำหนดในการประมวลผล
คัดลอกรหัสรหัส ดังต่อไปนี้:
แพ็คเกจ cn.xy.test;
-
* วิธีการทดสอบข้อยกเว้นรันไทม์
* @ผู้เขียน xy
-
-
RuntimeExcetionMethods ระดับสาธารณะ
-
โมฆะสาธารณะ method3() พ่น RuntimeException
-
System.out.println("ฉันเป็นวิธีการที่ส่งข้อยกเว้นรันไทม์");
-
โมฆะสาธารณะ testMethod3_01()
-
วิธีที่ 3();
-
โมฆะสาธารณะ testMethod1_02()
-
โยน RuntimeException ใหม่ ();
-
-
คลาสย่อยของคลาส RumtimeException ที่เราคุ้นเคยมากกว่านั้นรวมอยู่ด้วย
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException
3.ข้อผิดพลาด เมื่อเกิดข้อผิดพลาดที่ไม่สามารถควบคุมได้ในโปรแกรม วิธีการปกติคือการแจ้งให้ผู้ใช้ทราบและยุติการทำงานของโปรแกรม ไม่เหมือนกับข้อยกเว้น วัตถุที่มีข้อผิดพลาดและคลาสย่อยไม่ควรถูกโยนทิ้ง
Error เป็นคลาสย่อยของ Throwable ที่แสดงถึงเวลาคอมไพล์และข้อผิดพลาดของระบบ และใช้เพื่อระบุปัญหาร้ายแรงที่แอปพลิเคชันที่สมเหตุสมผลไม่ควรพยายามตรวจจับ
ข้อผิดพลาดถูกสร้างและส่งออกโดยเครื่องเสมือน Java รวมถึงความล้มเหลวของลิงก์แบบไดนามิก ข้อผิดพลาดของเครื่องเสมือน ฯลฯ โปรแกรมไม่ประมวลผล
2. เปลี่ยนโหมดเริ่มต้น <BR> กำหนด noRollbackFor และ RollbackFor ในคำอธิบายประกอบ @Transaction เพื่อระบุว่าจะย้อนกลับข้อยกเว้นบางอย่างหรือไม่
@ธุรกรรม (noRollbackFor = RuntimeException.class)
@ธุรกรรม(RollbackFor=Exception.class)
สิ่งนี้จะเปลี่ยนวิธีการประมวลผลธุรกรรมเริ่มต้น
3. การรู้แจ้ง <BR>สิ่งนี้กำหนดให้เราต้องสร้างข้อยกเว้นแบบกำหนดเองที่สืบทอดมาจาก RuntimeException เมื่อเราปรับแต่งข้อยกเว้น เพื่อที่ว่าเมื่อถูกส่งออกไป จะถูกจัดการอย่างถูกต้องโดยการประมวลผลธุรกรรมเริ่มต้นของ Spring