الـ Exception ماهو وطريقة استخدامه وتنفيذه
بسم الله الرحمن الرحيم
في java لدينا Throwable class لديه Error و Exception ك subclass .
Error class لا تستطيع معالجة أخطائه أو على الأقل أثناء Runtime
لذلك سيكون حديثنا عن Exception class
ماهو Exception ؟
هو خطأ-يقال في بعض الأحيان حدث ويقال استثناء- يحدث أثناء تشغيل البرنامج يقطع عملية تنفيذ الأوامر الخاصة بالبرنامج.
الان لنتطرق لعملية التحكم في الخطأ ومعالجته -catch and handle exceptions-
بداية نبدأ مع مفهوم try-catch وكالعادة نشوف المفهوم بعدين نشرحه
public static void main(String[] args)
{ int a = 5 ;
int b = 0 ;
System.out.println(a/b);
}
نلاحظ أن عندنا عملية قسمة لكن على صفر بمعنى أن الناتج راح يكون عدد لا نهائي -infinity- وهذا يعطيني exception من نوع ArithmeticException
ليتوقف البرنامج عن العمل -crash-و الحل طبعا أنك ما تقسم على صفر لكن سنحاول أن لا يحدث crash للبرنامج باستخدام try-catch block
public static void main(String[] args)
{ int a = 5 ;
int b = 0 ;
try{
System.out.println(a/b);
}catch(ArithmeticException e){
System.out.println("divid by zero!");
}
}
نلاحظ أن لدينا two blocks الأول try والثاني catch يبدأ البرنامج في تنفيذ مابداخل try في حال نجح في تنفيذه بدون exception فأنه يتجاوز catch بدون تنفيذها وفي حال ظهر exception فأنه يتوقف عن أكمل تنفيذ try وينتقل إلى catch .
جميل جدا لكن ماذا لو كان هناك احتمالية وجود أكثر من exception داخل try block أو كان لدي خطأ لا أعرف لأي نوع من exceptions ينتمي -في حال وضعت catch ل ArithmeticException ثم ظهر لك NullPointerException فإن catch block لن يستطيع التعامل معه- ففي هذه الحالة أستخدم try مع أكثر من catch block كما في المثال
public static void main (String args[]){
int x = 0 ;
Integer y = null ;
try {
System.out.println(5/x);
x = y ;
}catch(ArithmeticException e){
System.out.println("catch "+e.getMessage());
}catch (NullPointerException e) {
System.out.println("catch "+e.getMessage());
}
}
أما في حال لم تعرف هذا خطأ لأي نوع من exceptions ينتمي فتستخدم catch block مع Exception ك parameter لأن جميع ال Exceptions هم subclass من Exception وهذا أحد تطبيقات مبدأ polymorphism , فعلى سبيل المثل سنكرر المثال سابق ولكن نستبدل NullPointerException ب Exception
public static void main (String args[]){
int x = 0 ;
Integer y = null ;
try {
System.out.println(5/x);
x = y ;
}catch(ArithmeticException e){
System.out.println("catch "+e.getMessage());
}catch (Exception e) {
System.out.println("catch "+e.getMessage());
}
}
في هذه الحالة في حال ظهور أي خطأ غير ArithmeticException سوف يقوم Exception بتنفيذ catch الخاصة به وهنا يأتي سىؤال لماذا لا أكتفي ب Exception ؟
إذا كنت تريد أن تعامل كل خطأ بطريقة معينة-كإظهار رسالة معينة أو تنبيه وما إلى ذلك- فيفضل استخدام أكثر من catch block لكل catch ال Exception الخاص بها , أما في حال كان يهمك أن لا يحدث crash لتطبيق فسيكون حل مناسب لك .
جميل الآن نحن إما أن ننفذ try أو catch لكن ماذا لو كان لدينا أمر ما نريد أن ننفذه في حال تم تنفيذ try أو catch؟ الطريقة الصحيحة ليس أن تكتبه في كلا blocks لكن أن تستخدم جملة finally كما في المثال
tring args[]){
int x = 0 ;
Integer y = null ;
try {
System.out.println(5/x);
x = y ;
}catch(ArithmeticException e){
System.out.println("catch "+e.getMessage());
}catch (Exception e) {
System.out.println("catch "+e.getMessage());
}finally {
System.out.println("I will show up anyway");
}
}
ف finally block سوف يظهر على كل حال , في حال تنفيذ أي من try أو catch .
إذا لنلخص قسم try & catch & finally
- نستخدم try و catch واحده في حال كان هناك خطأ واحد
- نستخدم try وأكثر من catch في حال كان هناك أحتمالية وجود أكثر من خطأ
- نستخدم finally في حال أردنا تنفيذ أمر معين في كل الحالات .
- نستخدم Exception ك نوع ل exception في حال كنا فقط نريد أن لا يحدث crash أو كانت جميع الأخطاء لها نفس التعامل -كأن تظهر جميع الأخطاء رسالة Error-
طيب ماذا لو أردت أن تضع exception في حال قام أحدهم بخطأ ما , وليكن قام مدخل البيانات بإدخال راتب أحد الموظفين صفر فيكون ال exception بهذه الطريقة
public static void main (String args[]) throws Exception{
int Salary = 0 ;
try{
if(Salary<= 0 ){
throw new ArithmeticException();
}
}catch(ArithmeticException e){
System.out.println("R U serious!");
}
}
قد تكون لاحظت أننا طوال هذه المقالة نستخدم exception الخاصة بنفس اللغة , لكن ماذا لو أردنا بناء exception الخاص بنا بحيث عندما يدخل مدخل البيانات راتب خاطئ يكون هنا SalaryException
الأمر بسيط كل ما تحتاجه هو بناء class يعمل extends ل Exception وتضع الرسالة المراد إخراجها حال ظهور exception
public class SalaryException extends Exception {
public SalaryException() {
super("Salary not valid");
}
}
public class Salary {
public static void main (String args[]) throws Exception{
int Salary = 0 ;
try{
if(Salary<= 0 ){
throw new SalaryException();
}
}catch(SalaryException e){
System.out.println(e);
}
}
}
في هذه الحالة سوف يظهر لك Salary not valid .
Exception class لديه تصنيفين رئيسيين Checked Exception و Unchecked Exception
- Checked Exception
هي Exception يشير لها Compiler أثناء وقت تنفيذ الكود -Compile time- ويجبر المبرمج على معالجتها ,مثل
- IOException
- SQLException
- DataAccessException
- ClassNotFoundException
- InvocationTargetException
- MalformedURLException
- Unchecked Exception
على العكس فهذه Exception تكتشف أثناء عمل البرنامج -RuntimeException- مثل
- NullPointerException
- ArrayIndexOutOfBound
- IllegalArgumentException
- IllegalStateException
فحين تقوم بكتابة function وتضع داخلها throw لأحد أنواع Checked Exception فسيجبرك Compiler إما على declared exceptions باستخدام throws keyword أو استخدام try-catch كما في المثال
class Test {
static void Nmae (String name) throws IOException{
if (name == "")
throw new IOException("Empty name");
}
public static void main(String[] args) throws IOException {
Nmae ("");
}
}
نلاحظ أنك ستضع أيضا throws داخل أي function تستدعي فيها function التي بداخلها exceptions كم يحدث هنا في main
بالمناسبة Error class الذي تحدثنا عنه بداية المقالة جميع أخطائه تصنف Unchecked Exception
هذا وصلى الله وسلم وبارك على نبينا محمد
مراجع :
https://docs.oracle.com/javase/tutorial/essential/exceptions/index.html
http://beginnersbook.com/2013/12/throws-keyword-example-in-java/
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !