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

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

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

هرگونه خطای مدیریت نشده منجر به از کار افتادن برنامه شما خواهد شد.

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

جدول: کدهای HomeException
کد معنی
ABORTED این عملیات معمولاً به دلیل یک مشکل همزمانی مانند خرابی بررسی ترتیب‌سنج یا لغو تراکنش، لغو شد.
ALREADY_EXISTS موجودیتی که کلاینت سعی در ایجاد آن داشته است، مثلاً یک فایل یا دایرکتوری، از قبل وجود دارد.
API_NOT_CONNECTED کلاینت سعی در فراخوانی متدی از یک API داشته که اتصال آن ناموفق بوده است. این اتفاق زمانی رخ می‌دهد که دستگاه آفلاین باشد یا از API مورد نظر کلاینت پشتیبانی نکند.
CANCELLED عملیات، معمولاً توسط تماس‌گیرنده، لغو می‌شد.
COMMAND_FAILED دستور اجرا نشد. برای جزئیات بیشتر، کدهای خطای فرعی را بررسی کنید.
CURSOR_WINDOW_NOT_SUPPORTED متدی فراخوانی شد که از CursorWindow استفاده می‌کند، اما CursorWindow یا فعال نیست یا در متن فعلی پشتیبانی نمی‌شود.
DATA_LOSS از دست رفتن یا خرابی غیرقابل بازیابی داده‌ها رخ داده است.
DEADLINE_EXCEEDED مهلت قبل از اتمام عملیات به پایان رسیده است. برای عملیاتی که وضعیت سیستم را تغییر می‌دهند، حتی اگر عملیات با موفقیت انجام شده باشد، ممکن است این خطا بازگردانده شود.
DECOMMISSIONING_INELIGIBLE عملیات از رده خارج کردن دستگاه ناموفق بود زیرا دستگاه واجد شرایط از رده خارج کردن نبود.
FAILED_PRECONDITION این عملیات رد شد زیرا سیستم در حالت مورد نیاز برای اجرای عملیات نیست. برای مثال، اگر دستور stop OvenCavityOperationalStateTrait روی فر که از قبل متوقف شده است فراخوانی شود، ممکن است این پیام را دریافت کنید.
INTERNAL خطاهای داخلی. این بدان معناست که برخی از ثابت‌های مورد انتظار سیستم اصلی، دچار مشکل شده‌اند. این کد خطا برای خطاهای جدی در نظر گرفته شده است.
INVALID_ARGUMENT مشتری استدلالی ارائه داده است که خارج از محدوده مقادیر مورد انتظار است.
INVALID_DATA_HOLDER دارنده داده نامعتبر است.
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 لحاظ نشده باشد، این خطا رخ می‌دهد. به بخش مقداردهی اولیه خانه در اندروید مراجعه کنید.
UNAUTHENTICATED تماس‌گیرنده قابل شناسایی نیست یا درخواست دارای اعتبارنامه‌های احراز هویت معتبر نیست.
UNAVAILABLE سرویس در دسترس نیست. این به احتمال زیاد یک وضعیت گذرا است که می‌توان با تلاش مجدد با یک backoff آن را اصلاح کرد. توجه داشته باشید که تلاش مجدد برای عملیات غیر خودتوان همیشه ایمن نیست.
UNIMPLEMENTED عملیات درخواستی در این سرویس پیاده‌سازی، پشتیبانی یا فعال نشده است.
UNKNOWN خطای ناشناخته. UNKNOWN زمانی ظاهر می‌شود که یک وضعیت خطا رخ می‌دهد که نمی‌توان آن را با استفاده از هیچ یک از کدهای خطای دیگر طبقه‌بندی کرد. برای مثال، این خطا ممکن است زمانی بازگردانده شود که مقدار وضعیت دریافتی از یک API خارجی فاقد اطلاعات کافی در مورد علت اصلی باشد.
WRITE_FAILED اجرای عملیات نوشتن با شکست مواجه شد. برای جزئیات بیشتر، کدهای خطای فرعی را بررسی کنید.