مدیریت خطاها در جولیا
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
این مبحث بخشی از دوره آموزش کامل جولیا است.