unCheckException و checkedException چیست ؟
Checked exception چیست؟ Unchecked exception چیست؟ تفاوتشون چیه تغییر کنه. ممنون 🙏
public void myFunction() throws RuntimeException {
//code
}
try {
myFunction()
} catch(RuntimeException e) {
//recover program
}
– exceptionی که کاربر function باید چک(هندل) کنه –
نوع دوم مربوط به خطاهای برنامه نویسی هست که کاربر function باید اصلاحشون کنه و در واقع باگ برنامه هستن. اینجا ما نمیخوایم کاربر function هندلشون کنه، بلکه میخوایم کدش رو اصلاح کنه. پس تو function signature نمیاریمشون. به این Exceptionها میگیم Unchecked Exception
به عنوان قانون کلی: از Checked Exception برای زمانی که میشه برنامه رو recover کرد استفاده کن و از Unchecked Exception برای خطاهای برنامه نویسی.
۱- خطای 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)
اموزنده بود . مرسی