مدیریت خطاها در جولیا

try/catch/finally، throw، error و انواع استثنای جولیا

خطا در جولیا

وقتی چیزی اشتباه پیش برود، جولیا استثنا (Exception) پرتاب می‌کند — مگر اینکه مدیریتش کنید!

try/catch — مدیریت خطا

try
    result = 10 / 0
    println(result)
catch e
    println("خطا گرفتیم: $e")
end

println("برنامه ادامه دارد!")

try/catch/finally

try
    -- کدی که ممکن است خطا دهد
    riskyOperation()
catch e
    println("خطا: $e")
finally
    -- همیشه اجرا می‌شود (پاکسازی)
    println("پاکسازی انجام شد")
end

throw — پرتاب خطا

function divide(a, b)
    if b == 0
        throw(ErrorException("تقسیم بر صفر مجاز نیست!"))
    end
    return a / b
end

println(divide(10, 2))   # 5.0

try
    divide(10, 0)
catch e
    println("گرفتیم: ", e)
end

error — میان‌بر پرتاب

function sqrtSafe(x)
    if x < 0
        error("جذر عدد منفی: $x")
    end
    return sqrt(x)
end

try
    sqrtSafe(-4)
catch e
    println(e)
end

انواع استثنا

استثناکی رخ می‌دهد
ErrorExceptionخطای عمومی
DomainErrorمقدار خارج از دامنه (مثل جذر منفی)
ArgumentErrorآرگومان نامعتبر
BoundsErrorایندکس خارج از محدوده
MethodErrorمتدی برای این نوع وجود ندارد
TypeErrorنوع اشتباه

گرفتن نوع خطا

try
    arr = [1, 2, 3]
    println(arr[10])   # خارج از محدوده!
catch e
    if e isa BoundsError
        println("ایندکس خارج از محدوده!")
    else
        println("خطای دیگر: $e")
    end
end

الگوی امن: مقدار پیش‌فرض

function safeDivide(a, b)
    try
        return a / b
    catch
        return nothing   # یا 0، یا NaN
    end
end

println(safeDivide(10, 2))   # 5.0
println(safeDivide(10, 0))   # nothing (بدون خطا!)
در جولیا فرهنگ «مقدار برگردان» (مثل nothing) برای خطاهای قابل پیش‌بینی و try/catch برای خطاهای غیرمنتظره رایج است!

rethrow — پرتاب مجدد

try
    riskyCode()
catch e
    if e isa BoundsError
        println("خودمان مدیریت کردیم")
    else
        rethrow()   # خطاهای دیگر را رد کن
    end
end

مثال کامل: اعتبارسنجی ورودی

function processAge(age)
    age isa Integer || throw(ArgumentError("سن باید عدد صحیح باشد"))
    age >= 0 || throw(ArgumentError("سن نمی‌تواند منفی باشد"))
    age <= 150 || throw(ArgumentError("سن بیش از حد واقعی است!"))
    return age
end

for test in [25, -5, "سی", 200]
    try
        println("✅ ", processAge(test))
    catch e
        println("❌ ", e)
    end
end

این مبحث بخشی از دوره آموزش کامل جولیا است.

ابزارهای مرتبط