الـ Exception ماهو وطريقة استخدامه وتنفيذه

3zcsمنذ سنة

بسم الله الرحمن الرحيم

في 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

https://crunchify.com/better-understanding-on-checked-vs-unchecked-exceptions-how-to-handle-exception-better-way-in-java/

http://beginnersbook.com/2013/12/throws-keyword-example-in-java/

كلمات دليلية:
1
إعجاب
662
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !