Android-FAQ icon indicating copy to clipboard operation
Android-FAQ copied to clipboard

‫unCheckException و checkedException چیست ؟

Open FatemehKavoosi opened this issue 5 years ago • 7 comments

FatemehKavoosi avatar Jul 06 '20 19:07 FatemehKavoosi

به نظرم بهتره به:

Checked exception چیست؟ Unchecked exception چیست؟ تفاوتشون چیه تغییر کنه. ممنون 🙏

DHosseiny avatar Jul 07 '20 06:07 DHosseiny

وقتی functionی مینویسیم ممکنه حالتهای خطایی برای اون function وجود داشته باشه. تو این حالتها exception throw میکنیم. حالا اگه این exception جوری باشه که کاربر function بتونه بعد رخ دادن خطا روال recover کردن برنامه شو طی کنه ما مجبورش میکنیم که try/catch بزاره و خطا رو هندل کنه. ما این کار رو با نوشتن throws Excetion تو function signature انجام میدیم. مثل:
public void myFunction() throws RuntimeException {
	//code
}
try {
    myFunction()
} catch(RuntimeException e) {
    //recover program
}
به این نوع exception میگیم Checked Exception

– exceptionی که کاربر function باید چک(هندل) کنه –

نوع دوم مربوط به خطاهای برنامه نویسی هست که کاربر function باید اصلاحشون کنه و در واقع باگ برنامه هستن. اینجا ما نمیخوایم کاربر function هندلشون کنه، بلکه میخوایم کدش رو اصلاح کنه. پس تو function signature نمیاریمشون. به این Exceptionها میگیم Unchecked Exception

به عنوان قانون کلی: از Checked Exception برای زمانی که میشه برنامه رو recover کرد استفاده کن و از Unchecked Exception برای خطاهای برنامه نویسی.

DHosseiny avatar Jul 07 '20 09:07 DHosseiny

در کاتلین Checked Exception نداریم. یعنی نمیشه کاربر function رو مجبور کرد که try/catch بزاره. (البته اگر زبان کاربر جاوا باشه میشه با @Throws مجبورش کرد)

DHosseiny avatar Jul 07 '20 09:07 DHosseiny

@FatemehKavoosi لطفا closeش کنید اگر قابل قبوله.

DHosseiny avatar Jul 07 '20 09:07 DHosseiny

۱- خطای checked exception : این نوع خطاها زمان #کامپایل بهمون نشون داده میشن و ی سری کدها ما تو برناممون مینویسیم و مجبورمون میکنه براش try-catch بذاریم . مثلا اگر یک فایلی رو بخوای بخونی میگه حتما تو ترای کش این عملیات رو انجام بده ! خب تو این حالت اگر خطایی رخ بده کاربر میتونه تو catch هندل کنه اگر خطایی رخ داد چه کاری انجام شه و بقولی خطاهایی هستن که قابل ریکاور هستن .

۲- خطای unchecked exception : خطاهایی هستند که زمان رانتایم رخ میده و دیگه کاری از دست برنامه نویس بر نمیاد .و باید کدش رو اصلاح کنه . مثل خطای تقسیم بر صفر - یا مثلا دسترسی به خونه ای از ارایه که وجود نداره .مثلا دوتا خونه ارایه داری و بخونه ای با اندیس 3 ارجاع بدی

FatemehKavoosi avatar Jul 08 '20 17:07 FatemehKavoosi

با توجه به تست های انجام شده در مورد بلاک finally و مزایای استفاده از آن میشه گفت :

  • ممکنه که Exception هندل نشده باشه و اجرای try باعث خطا بشه
try {
     // divide by zero
     val i = 1/0 
     println("try")
 } catch(e : NumberFormatException) {
     println("catch")  
 } finally {
     println("finally")
 }

--------------------------
Result:
finally

البته با خطای زیر کرش میکنه
java.lang.ArithmeticException: / by zero
  • ممکنه که بلاک کش Exception داشته باشه و باعث خطا بشه
try {
       throw Exception()
    } catch (e: Exception){
        // divide by zero again!
        1/0 
    } finally {
       println("finally")
    }

--------------------------
Result:
finally

البته با خطای زیر کرش میکنه
java.lang.ArithmeticException: / by zero
  • فراخوانی System.exit قبل از اتفاق اتفادن خطا باعث توقف کل فرایند میشه و دیگه finally اجرا نمیشه . اما اگر System.exit بعد از اتفاق افتادن خطا باشه catch و finally اجرا می شوند (چون عملا کدهای بعد از خطا unreachable میشن)
try {
         println("try")

         // divide by zero
         val i = 1/0
         System.exit(0)
 } catch (e: Exception) {
         println("catch")
 }  finally {
         println("finally")
 }

--------------------------
Result:
try
catch
finally

try {
         println("try")
         System.exit(0)
         
         // divide by zero
         val i = 1/0
 } catch (e: Exception) {
         println("catch")
 }  finally {
         println("finally")
 }

--------------------------
Result:
try

در صورتی که exit نکنیم بلاک finally حتما فراخوانی می شود

بلاک های try و catch میتونن مقدار return کنن ولی finally چیزی بر نمیگردونه

val result = try {
   val i = 1 / 0
   1000
} catch (e: Exception) {
   2000
} finally {
   assert(true)
}

assert(result == 2000)

dariush-fathie avatar Jul 31 '20 11:07 dariush-fathie

اموزنده بود . مرسی

amirhosenebrahimi avatar May 16 '24 17:05 amirhosenebrahimi