مدیریت خطا در اندروید

کاتلین از استثناهای بررسی شده پشتیبانی نمی کند. این کار مدیریت خطا را ساده و ساده می‌کند، زیرا می‌توانید تنها استثناهایی را که به طور بالقوه قابل بازیابی هستند، مدیریت کنید. و از آنجایی که مجبور نیستید به طور صریح از هر استثنای ممکن استفاده کنید، کد شما درهم و برهم کمتر است و در نتیجه، بیشتر بر هدف اصلی خود متمرکز می شود.

خرابی‌های قابل بازیابی مسائلی هستند که یک توسعه‌دهنده می‌تواند از ابتدا به آنها رسیدگی کند. به عنوان مثال، اگر شناسه ای که در تماس استفاده می شود معتبر نباشد، API یک HomeException با یک پیام invalid data پرتاب می کند. سپس توسعه‌دهنده برنامه می‌تواند انتخاب کند که شناسه را از حافظه پنهان خود حذف کند یا پیامی مانند «ساختار یافت نشد» را به کاربر نشان دهد.

مثالی از نحوه برخورد با یک شکست قابل بازیابی:

val result =
   try {
     homeManager.requestPermissions()
   } catch (e: HomeException) {
     PermissionsResult(
       PermissionsResultStatus.ERROR,
       "Got HomeException with error: ${e.message}",
     )
   }

هر روشی در APIهای Home می‌تواند یک HomeException ایجاد کند، بنابراین توصیه می‌کنیم از یک بلوک try-catch برای گرفتن HomeException در همه تماس‌ها استفاده کنید.

هنگام مدیریت HomeException ، قسمت های code و message آن را بررسی کنید تا متوجه شوید چه مشکلی پیش آمده است.

هرگونه استثناء کنترل نشده منجر به خرابی برنامه شما می شود.

جدول زیر معانی کدهای HomeException را ارائه می دهد که ممکن است با آنها روبرو شوید:

جدول: کدهای HomeException
کد معنی
ABORTED این عملیات معمولاً به دلیل یک مشکل همزمانی مانند شکست چک ترتیب‌دهنده یا لغو تراکنش متوقف شد.
ALREADY_EXISTS موجودی که یک کلاینت سعی در ایجاد آن داشت، برای مثال یک فایل یا دایرکتوری، از قبل وجود دارد.
API_NOT_CONNECTED کلاینت سعی کرد روشی را از یک API فراخوانی کند که اتصال ناموفق بود. این ممکن است زمانی اتفاق بیفتد که دستگاه آفلاین است یا از API که مشتری سعی کرده با آن تماس بگیرد، پشتیبانی نمی‌کند.
CANCELLED این عملیات معمولاً توسط تماس گیرنده لغو شد.
DATA_LOSS از دست دادن یا خرابی داده غیرقابل جبران رخ داده است.
DEADLINE_EXCEEDED مهلت قبل از تکمیل عملیات به پایان رسید. برای عملیاتی که وضعیت سیستم را تغییر می دهد، حتی اگر عملیات با موفقیت به پایان رسیده باشد، ممکن است این خطا برگردانده شود.
FAILED_PRECONDITION عملیات رد شد زیرا سیستم در وضعیت لازم برای اجرای عملیات نیست. به عنوان مثال، اگر دستور stop OvenCavityOperationalStateTrait در فری که قبلاً متوقف شده فراخوانی شده باشد، یا اگر بخواهید عملیات rmdir را در غیر دایرکتوری اجرا کنید، ممکن است این پیام را دریافت کنید.
INTERNAL خطاهای داخلی این بدان معنی است که برخی از متغیرهای مورد انتظار سیستم اساسی شکسته شده اند. این کد خطا برای خطاهای جدی رزرو شده است.
INVALID_ARGUMENT مشتری آرگومانی ارائه کرد که خارج از محدوده مورد انتظار مقادیر است.
NOT_FOUND یک موجودیت درخواستی، مانند یک فایل یا فهرست، یافت نشد. اگر درخواستی برای کل دسته از کاربران رد شود، مانند عرضه تدریجی ویژگی یا لیست مجوزهای غیرمستند، ممکن است از NOT_FOUND استفاده شود. اگر درخواستی برای برخی از کاربران در یک کلاس از کاربران رد شود، مانند کنترل دسترسی مبتنی بر کاربر، باید از PERMISSION_DENIED استفاده شود.
OUT_OF_RANGE این عملیات از محدوده معتبر گذشته است، مانند جستجو یا خواندن end-of-file گذشته. برخلاف INVALID_ARGUMENT ، این خطا نشان دهنده مشکلی است که در صورت تغییر وضعیت سیستم ممکن است برطرف شود.
PERMISSION_DENIED تماس گیرنده اجازه اجرای عملیات مشخص شده را ندارد. PERMISSION_DENIED نباید برای ردهای ناشی از فرسودگی برخی منابع استفاده شود ( RESOURCE_EXHAUSTED برای آن خطاها استفاده کنید). PERMISSION_DENIED در صورتی که تماس گیرنده قابل شناسایی نباشد نباید استفاده شود ( UNAUTHENTICATED برای این خطاها استفاده کنید). این کد خطا به این معنی نیست که درخواست معتبر است یا موجودیت درخواست شده وجود دارد یا سایر پیش شرط ها را برآورده می کند.
RESOURCE_EXHAUSTED برخی از منابع تمام شده است، شاید به دلیل رسیدن به سهمیه هر کاربر یا کمبود فضای کل سیستم فایل. به عنوان مثال، اگر دستور dispense DispenseTrait در دستگاه تغذیه حیوانات خانگی فراخوانی شود، اما غذای دیگری در دستگاه باقی نماند، این خطا ممکن است ایجاد شود.
SDK_INITIALIZATION_MISSING_INFO SDK بدون تمام اطلاعات مورد نیاز مقداردهی اولیه شد. به عنوان مثال، اگر مشتری تلاش کند یک TraitFactory برای یک شناسه مشخصه دریافت کند، اما این ویژگی هنگام شروع اولیه SDK لحاظ نشده باشد، این خطا ایجاد می شود. به Initialize the home در Android مراجعه کنید.
UNAUTHENTICATED تماس گیرنده را نمی توان شناسایی کرد یا درخواست اعتبار احراز هویت معتبری ندارد.
UNAVAILABLE سرویس در دسترس نیست. این به احتمال زیاد یک وضعیت گذرا است، که می توان با تلاش مجدد با عقب نشینی آن را اصلاح کرد. توجه داشته باشید که همیشه امتحان مجدد عملیات های غیر توانمند ایمن نیست.
UNIMPLEMENTED عملیات درخواستی در این سرویس اجرا، پشتیبانی یا فعال نشده است.
UNKNOWN خطای ناشناخته UNKNOWN زمانی ظاهر می شود که یک وضعیت خطایی رخ می دهد که نمی توان با استفاده از هیچ یک از کدهای خطای دیگر طبقه بندی کرد. به عنوان مثال، زمانی که یک مقدار وضعیت دریافتی از یک API خارجی فاقد اطلاعات کافی در مورد علت اصلی باشد، این خطا ممکن است برگردانده شود.