‫unCheckException و checkedException چیست ؟

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

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

وقتی functionی مینویسیم ممکنه حالتهای خطایی برای اون function وجود داشته باشه. تو این حالتها exception throw میکنیم. حالا اگه این exception جوری باشه که کاربر function بتونه بعد رخ دادن خطا روال recover کردن برنامه شو طی کنه ما مجبورش میکنیم که try/catch بزاره و خطا رو هندل کنه. ما این کار رو با نوشتن throws Excetion تو function signature انجام میدیم. مثل:</p>

``` 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 برای خطاهای برنامه نویسی. در کاتلین Checked Exception نداریم. یعنی نمیشه کاربر function رو مجبور کرد که try/catch بزاره. (البته اگر زبان کاربر جاوا باشه میشه با @Throws مجبورش کرد)
@FatemehKavoosi لطفا closeش کنید اگر قابل قبوله. ۱- خطای checked exception : این نوع خطاها زمان #کامپایل بهمون نشون داده میشن و ی سری کدها ما تو برناممون مینویسیم و مجبورمون میکنه براش try-catch بذاریم . مثلا اگر یک فایلی رو بخوای بخونی میگه حتما تو ترای کش این عملیات رو انجام بده ! خب تو این حالت اگر خطایی رخ بده کاربر میتونه تو catch هندل کنه اگر خطایی رخ داد چه کاری انجام شه و بقولی خطاهایی هستن که قابل ریکاور هستن . ۲- خطای unchecked exception : خطاهایی هستند که زمان رانتایم رخ میده و دیگه کاری از دست برنامه نویس بر نمیاد .و باید کدش رو اصلاح کنه . مثل خطای تقسیم بر صفر - یا مثلا دسترسی به خونه ای از ارایه که وجود نداره .مثلا دوتا خونه ارایه داری و بخونه ای با اندیس 3 ارجاع بدی با توجه به تست های انجام شده در مورد بلاک 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) ```