مدیریت خطا (Swift Error Handling)
در «مدیریت خطا (Error Handling)» یاد می گیریم خطا را «پرتاب (throw)» کنیم و سپس با «سعی (try)» و «گرفتن (catch)» آن را مدیریت کنیم. همچنین «try?»، شکست را به «اختیاری (Optional)» تبدیل می کند. این کارها برنامه را قابل اعتمادتر می کند.
مفهوم مدیریت خطای سویفت
تابع می تواند خطا را با throw پرتاب کند. سپس فراخواننده باید با try آن را اجرا کند و در بلوک do/catch خطا را بگیرد. اگر نتیجه اختیاری می خواهی، از try? استفاده کن.
Throw، Try، Catch در عمل
enum InputError: Error {
case negative
}
func validate(_ n: Int) throws -> String {
if n < 0 {
throw InputError.negative
}
return "ok: \(n)"
}
do {
let result = try validate(-1)
print(result)
} catch {
print("error")
}
let maybe = try? validate(1)
print(maybe ?? "nil")
با do/catch خطا گرفته می شود. اما با try? نتیجه اختیاری می گیری. بنابراین می توانی راحت تر جریان را کنترل کنی. برای مقایسه رفتار ترتیب، صفحه Equatable و Comparable را هم ببین.
نکته: از defer برای اجرای کد پاکسازی هنگام خروج از اسکوپ استفاده کن؛ حتی اگر خطا رخ دهد.
Defer برای پاکسازی
با defer اطمینان می دهی کد پاکسازی همیشه اجرا شود. چه خطا رخ دهد، چه نه.
enum FileError: Error {
case fail
}
func work(_ ok: Bool) throws {
print("start")
defer {
print("cleanup")
}
if !ok {
throw FileError.fail
}
print("done")
}
do {
try work(false)
} catch {
print("error")
}
گام های عملی
- کدها را اجرا کن و خروجی را ببین.
try?را جایگزین کن و نتیجه را چاپ کن.- مقدار
okرا تغییر بده و ترتیب پیام ها را بررسی کن.
پس از یادگیری مدیریت خطا، سراغ Concurrency در سویفت برو تا خطاها را در کارهای همزمان هم مدیریت کنی.
جمع بندی سریع
throwبرای اعلام خطاست.tryوdo/catchبرای گرفتن خطاست.try?خروجی اختیاری می دهد.deferهمیشه پاکسازی را اجرا می کند.