رسیدگی به خطا در iOS

سوئیفت پشتیبانی داخلی برای ارسال و دریافت خطاهای قابل بازیابی در زمان اجرا ارائه می‌دهد. به عنوان مثال، اگر عملیاتی در کد شما با شکست مواجه شود یا معتبر نباشد، 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 که ممکن است با آنها مواجه شوید را ارائه می‌دهد:

جدول: کدهای 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 خارجی دریافت شود که فاقد اطلاعات کافی در مورد علت اصلی باشد.