مدیریت خطا در iOS

Swift پشتیبانی داخلی برای پرتاب و گرفتن خطاهای قابل‌بازیابی در زمان اجرا ارائه می‌دهد. برای مثال، اگر عملیاتی در کد شما ناموفق باشد یا معتبر نباشد، میانای برنامه‌سازی کاربردی خطای HomeError را نشان می‌دهد. این کار با امکان تمرکز فقط روی خطاهای قابل‌بازیابی، رسیدگی به خطا را ساده و کارآمد می‌کند. سپس می‌توانید گزینه‌هایی ارائه دهید، مثلاً به کاربر اجازه دهید دوباره امتحان کند یا پیامی مثل «ساختار پیدا نشد» نمایش دهید. And because you don't have to explicitly handle every possible exception, your code is less cluttered and consequently, remains more focused on its primary purpose.

نمونه‌ای از نحوه رسیدگی به خطای قابل‌بازیابی:

    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 نهاد یا منبعی را مشخص کرده‌اید که پیدا نمی‌شود. برای مثال، مشخص کردن شناسه قطعه‌ای که وجود ندارد هنگام فراخوانی play در دستگاه پخش‌کننده رسانه.
outOfRange پارامتری براساس وضعیت فعلی سیستم از محدوده معتبر فراتر رفته است. این پیام زمانی رخ می‌دهد که مقدار در محدوده مقادیری باشد که فراخوانی API به‌طور بالقوه می‌تواند بپذیرد، اما در زمینه فعلی منطقی نیست.
permissionDenied اجازه اجرای عملیات مشخص‌شده را ندارید. این کد خطا نباید به این معنی تفسیر شود که درخواست به‌طور کلی معتبر است.
resourceExhausted برخی‌از منابع تمام شده است. برای مثال، این خطا ممکن است زمانی رخ دهد که کاربر dispense(item:amount:unit:presetName:) را در دستگاه غذا دادن به حیوان خانگی فراخوانی کند و دیگر غذایی در دستگاه باقی نمانده باشد.

این مشکل ممکن است به‌دلیل فراتر رفتن از سهمیه پروژه Home APIs نیز باشد. برای اطلاعات بیشتر، مدیریت سهمیه را ببینید.
unauthenticated فراخواننده شناسایی نمی‌شود یا درخواست اعتبارنامه اصالت‌سنجی معتبر ندارد.
unavailable سرویس دردسترس نیست. این احتمالاً شرایطی گذرا است که با امتحان مجدد با عقب‌نشینی اصلاح می‌شود. توجه داشته باشید که امتحان مجدد عملیات غیریکسان‌توان همیشه ایمن نیست.
unimplemented عملیات درخواستی در این سرویس پیاده‌سازی، پشتیبانی، یا فعال نشده است.
unknown خطای ناشناس. به‌طور کلی، unknown زمانی ظاهر می‌شود که شرایط خطایی رخ دهد که بااستفاده از هیچ‌کدام از کدهای خطای دیگر قابل طبقه‌بندی نباشد. برای مثال، این خطا ممکن است زمانی برگردانده شود که مقدار وضعیت دریافتی از API خارجی فاقد اطلاعات کافی درباره علت ریشه‌ای باشد.