سوئیفت پشتیبانی داخلی برای ارسال و دریافت خطاهای قابل بازیابی در زمان اجرا ارائه میدهد. به عنوان مثال، اگر عملیاتی در کد شما با شکست مواجه شود یا معتبر نباشد، API یک خطای HomeError ارسال میکند. این امر با تمرکز فقط بر خطاهای قابل بازیابی، مدیریت خطا را ساده و کارآمد میکند. سپس میتوانید گزینههایی مانند اجازه دادن به کاربر برای تلاش مجدد یا نمایش پیامی مانند "ساختار یافت نشد" را ارائه دهید. و از آنجا که لازم نیست صریحاً هر استثنای ممکن را مدیریت کنید، کد شما کمتر بهم ریخته است و در نتیجه، بیشتر بر هدف اصلی خود متمرکز میماند.
مثالی از نحوه برخورد با یک خرابی قابل بازیابی:
let light1 = lightDevices.first
if let light = light1 {
do {
try await structure.move(device: light, to: room)
} catch let error as HomeError {
// Code for handling the exception
}
جدول زیر معانی کدهای HomeError که ممکن است با آنها مواجه شوید را ارائه میدهد:
| کد | معنی |
|---|---|
aborted | عملیات لغو شد. این خطا معمولاً زمانی ظاهر میشود که یک مشکل همزمانی مانند عدم موفقیت در بررسی توالی یا لغو تراکنش وجود داشته باشد. |
alreadyExists | منبع یا موجودیتی که میخواهید ایجاد کنید، از قبل وجود دارد. این میتواند مثلاً یک برنامهی زمانی نامگذاری شده برای یک ترموستات باشد. |
cancelled | عملیات، معمولاً توسط تماسگیرنده، لغو میشد. |
dataLoss | از دست رفتن یا خرابی غیرقابل بازیابی دادهها. |
deadlineExceeded | مهلت قبل از تکمیل عملیات منقضی شد. برای عملیاتی که وضعیت سیستم را تغییر میدهند، این خطا ممکن است حتی اگر عملیات با موفقیت انجام شده باشد، بازگردانده شود. به عنوان مثال، پاسخ موفقیتآمیز از یک سرور میتواند به اندازه کافی به تأخیر بیفتد تا مهلت منقضی شود. |
failedPrecondition | این عملیات رد شد زیرا سیستم در حالت مورد نیاز برای اجرای عملیات نیست. برای مثال، اگر تابع stop روی اجاقی که از قبل متوقف شده است فراخوانی کنید، ممکن است این پیام را دریافت کنید. |
internal | خطاهای داخلی. این بدان معناست که برخی از ثابتهای مورد انتظار سیستم اصلی، دچار مشکل شدهاند. این کد خطا برای خطاهای جدی در نظر گرفته شده است. |
invalidArgument | کلاینت یک آرگومان نامعتبر مشخص کرده است. توجه داشته باشید که این با `failedPrecondition` متفاوت است. `invalidArgument` نشان دهنده آرگومانهایی است که صرف نظر از وضعیت سیستم، مشکلساز هستند (برای مثال، یک نام فایل ناقص). |
notFound | شما یک موجودیت یا منبعی را مشخص کردهاید که پیدا نمیشود. برای مثال، مشخص کردن یک شناسه آهنگ (track id) که وجود ندارد هنگام فراخوانی play در دستگاه پخش رسانه. |
outOfRange | بر اساس وضعیت فعلی سیستم، یک پارامتر از محدودهی مجاز فراتر رفته است. این پیام زمانی رخ میدهد که مقدار در محدودهی مقادیری باشد که فراخوانی API میتواند بهطور بالقوه بپذیرد، اما در شرایط فعلی منطقی نیست. |
permissionDenied | شما مجوز اجرای عملیات مشخص شده را ندارید. این کد خطا نباید به این معنی تفسیر شود که درخواست معتبر است. |
resourceExhausted | برخی از منابع به اتمام رسیدهاند. برای مثال، این خطا میتواند زمانی رخ دهد که کسی تابع dispense(item:amount:unit:presetName:) را روی دستگاه تغذیه حیوانات خانگی فراخوانی کند و دیگر غذایی در دستگاه باقی نمانده باشد. |
unauthenticated | تماسگیرنده قابل شناسایی نیست یا درخواست دارای اعتبارنامههای احراز هویت معتبر نیست. |
unavailable | سرویس در دسترس نیست. این به احتمال زیاد یک وضعیت گذرا است که میتوان با تلاش مجدد با یک backoff آن را اصلاح کرد. توجه داشته باشید که تلاش مجدد برای عملیات غیر خودتوان همیشه ایمن نیست. |
unimplemented | عملیات درخواستی در این سرویس پیادهسازی، پشتیبانی یا فعال نشده است. |
unknown | خطای ناشناخته. به طور کلی، وقتی خطایی رخ میدهد که نمیتوان آن را با استفاده از هیچ یک از کدهای خطای دیگر طبقهبندی کرد، unknown ظاهر میشود. به عنوان مثال، این خطا ممکن است زمانی بازگردانده شود که مقدار وضعیتی از یک API خارجی دریافت شود که فاقد اطلاعات کافی در مورد علت اصلی باشد. |