1. الاستنتاج
تقوم إدارة المعاملات في Spring فقط بإرجاع استثناءات وقت التشغيل (java.lang.RuntimeException وفئاتها الفرعية) بشكل افتراضي.
إذا طرحت إحدى الطرق استثناءً أو استثناءً محددًا، فلن تقوم إدارة معاملات Spring بالتراجع افتراضيًا.
مقدمة تفصيلية لتصنيف الاستثناءات:
1. المفاهيم الأساسية <BR> انظر إلى مخطط بنية الاستثناء لـ Java
Throwable هو أصل كل الاستثناءات، java.lang.Throwable
الخطأ هو خطأ، java.lang.Error
الاستثناء هو استثناء، java.lang.Exception
2. استثناء
يتم تقسيمها عمومًا إلى استثناءات محددة واستثناءات وقت التشغيل، وتسمى جميع مثيلات فئة RuntimeException وفئاتها الفرعية باسم استثناءات وقت التشغيل، وتسمى الاستثناءات التي لا تندرج ضمن هذه الفئة باسم CheckedExceptions.
① الاستثناء المحدد توفر لغة Java فقط الاستثناءات المحددة. تعتبر Java الاستثناءات المحددة بمثابة استثناءات يمكن معالجتها، لذلك يجب أن تتعامل برامج Java بشكل صريح مع الاستثناءات المحددة. إذا لم يتعامل البرنامج مع الاستثناء المحدد، فسيحدث خطأ عندما يتم ترجمة البرنامج ولا يمكن تجميعه. يعكس هذا فلسفة تصميم Java: التعليمات البرمجية التي لا تحتوي على معالجة مثالية للأخطاء ليس لديها فرصة للتنفيذ. هناك طريقتان للتعامل مع الاستثناءات المحددة
(1) إذا كانت الطريقة الحالية تعرف كيفية التعامل مع الاستثناء، فإنها تستخدم كتلة محاولة...التقاط للتعامل مع الاستثناء.
(2) إذا كانت الطريقة الحالية لا تعرف كيفية التعامل معها، فقم بإعلان طرح الاستثناء عند تحديد الطريقة.
انسخ رمز الكود كما يلي:
الحزمة cn.xy.test;
import java.io.IOException;
/**
* تم التحقق من طريقة اختبار الاستثناء
* @المؤلف س ص
*
*/
فئة عامة CheckedExceptionMethods
{
// تتضمن فئة الاستثناء الإجمالية كلا من checkException وRuntimeException، لذلك يجب معالجة checkException
طريقة الفراغ العامة 1 () تطرح استثناءً
{
System.out.println("أنا طريقة للفئة العامة التي تطرح الاستثناءات");
}
// قبض على هذا الاستثناء وتعامل معه
اختبار الفراغ العامMethod1_01()
{
يحاول
{
way1();
}
قبض (الاستثناء ه)
{
printStackTrace();
}
}
// تمرير الاستثناء
اختبار الفراغ العامMethod1_02() يطرح استثناءً
{
way1();
}
اختبار الفراغ العامMethod1_03() يطرح استثناءً
{
رمي استثناء جديد ()؛
}
اختبار الفراغ العامMethod1_04()
{
يحاول
{
رمي استثناء جديد ()؛
}
قبض (الاستثناء ه)
{
printStackTrace();
}
}
يمثل // checkException عادةً IOException
طريقة الفراغ العام 2 () تطرح IOException
{
System.out.println("أنا الطريقة التي تطرح استثناء الإدخال والإخراج");
}
اختبار الفراغ العامMethod2_01()
{
يحاول
{
way2();
}
قبض (الاستثناء ه)
{
printStackTrace();
}
}
اختبار الفراغ العامMethod2_02() يلقي استثناءً
{
way2();
}
}
تتضمن الاستثناءات المحددة التي نحن أكثر دراية بها
Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IOException
②RuntimeException
في وقت التشغيل، إذا كان المقسوم عليه 0 أو كان المصفوفة منخفضة خارج الحدود، وما إلى ذلك، فإنها تحدث بشكل متكرر ويصعب التعامل معها. سيكون لعرض الإعلانات أو الالتقاطات تأثير كبير على سهولة القراءة وكفاءة تشغيل البرنامج. لذلك يكتشفها النظام تلقائيًا ويسلمها إلى معالج الاستثناء الافتراضي. بالطبع، يمكنك أيضًا التقاطها بشكل صريح إذا كانت لديك متطلبات معالجة.
انسخ رمز الكود كما يلي:
الحزمة cn.xy.test;
/**
* طريقة اختبار استثناء وقت التشغيل
* @المؤلف س ص
*
*/
فئة RuntimeExcetionMethods العامة
{
طريقة الفراغ العامة 3 () تطرح RuntimeException
{
System.out.println("أنا طريقة ترمي استثناءات وقت التشغيل");
}
اختبار الفراغ العامMethod3_01()
{
way3();
}
اختبار الفراغ العامMethod1_02()
{
رمي RuntimeException () جديد؛
}
}
تتضمن الفئات الفرعية لفئة RumtimeException التي نعرفها أكثر
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException
3. خطأ عند حدوث خطأ لا يمكن السيطرة عليه في أحد البرامج، فإن النهج المعتاد هو إخطار المستخدم وإنهاء تنفيذ البرنامج. على عكس الاستثناءات، لا ينبغي طرح كائنات الخطأ وفئاتها الفرعية.
الخطأ هو فئة فرعية من الأخطاء القابلة للرمي والتي تمثل أخطاء وقت الترجمة والنظام وتستخدم للإشارة إلى المشكلات الخطيرة التي يجب ألا تحاول التطبيقات المعقولة اكتشافها.
يتم إنشاء الأخطاء وإلقاءها بواسطة جهاز Java الظاهري، بما في ذلك فشل الارتباط الديناميكي، وأخطاء الجهاز الظاهري، وما إلى ذلك. البرنامج لا يعالجها.
2. قم بتغيير الوضع الافتراضي <BR> حدد noRollbackFor وRollbackFor في التعليق التوضيحي @Transaction لتحديد ما إذا كان سيتم التراجع عن بعض الاستثناءات أم لا.
@Transaction(noRollbackFor=RuntimeException.class)
@Transaction(RollbackFor=Exception.class)
يؤدي هذا إلى تغيير طريقة معالجة المعاملات الافتراضية.
3. التنوير <BR> يتطلب منا ذلك أن نجعل الاستثناء المخصص يرث من RuntimeException عندما نقوم بتخصيص الاستثناء، بحيث يتم معالجته بدقة عند طرحه من خلال معالجة المعاملات الافتراضية لـ Spring.