Android पर गड़बड़ी ठीक करना

Kotlin में, चेक किए गए अपवादों की सुविधा उपलब्ध नहीं है. इससे गड़बड़ी को ठीक करना आसान और बेहतर हो जाता है. ऐसा इसलिए, क्योंकि सिर्फ़ उन अपवादों को ठीक किया जा सकता है जिन्हें ठीक किया जा सकता है. इसके अलावा, आपको हर संभावित अपवाद को साफ़ तौर पर ठीक करने की ज़रूरत नहीं होती. इसलिए, आपका कोड कम उलझा हुआ होता है और इस वजह से, यह अपने मुख्य मकसद पर ज़्यादा फ़ोकस कर पाता है.

ठीक की जा सकने वाली गड़बड़ियां वे समस्याएं होती हैं जिन्हें डेवलपर अपने लेवल पर ठीक कर सकता है. उदाहरण के लिए, अगर कॉल में इस्तेमाल किया गया कोई आईडी मान्य नहीं है, तो एपीआई, HomeException दिखाता है. साथ ही, invalid data मैसेज भी दिखाता है. इसके बाद, ऐप्लिकेशन का डेवलपर या तो उस आईडी को अपनी कैश मेमोरी से हटा सकता है या उपयोगकर्ता को "स्ट्रक्चर नहीं मिला" जैसा मैसेज दिखा सकता है.

ठीक की जा सकने वाली गड़बड़ी को ठीक करने का एक उदाहरण:

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

होम एपीआई के किसी भी तरीके से HomeException दिखाया जा सकता है. इसलिए, हमारा सुझाव है कि सभी कॉल पर HomeException को पकड़ने के लिए, try-catch ब्लॉक का इस्तेमाल करें.

HomeException को ठीक करते समय, यह जानने के लिए कि क्या गड़बड़ी हुई है, इसके error.code और error.message फ़ील्ड देखें. सब-एरर कोड भी हो सकते हैं इसलिए, getSubErrorCodes() तरीके को कॉल करें और नतीजा देखें.

अगर अपवादों को ठीक नहीं किया जाता है, तो आपका ऐप्लिकेशन क्रैश हो जाएगा.

यहां दी गई टेबल में, HomeException कोड के मतलब बताए गए हैं. ये कोड आपको दिख सकते हैं:

टेबल: HomeException कोड
कोड मतलब
ABORTED आम तौर पर, एक साथ कई काम करने से जुड़ी समस्या की वजह से, कार्रवाई रद्द कर दी गई. जैसे, सीक्वेंसर की जांच में गड़बड़ी या ट्रांजै़क्शन रद्द होना.
ALREADY_EXISTS क्लाइंट ने जिस इकाई को बनाने की कोशिश की, वह पहले से मौजूद है. जैसे, कोई फ़ाइल या डायरेक्ट्री.
API_NOT_CONNECTED क्लाइंट ने किसी ऐसे एपीआई के तरीके को कॉल करने की कोशिश की जिससे कनेक्ट नहीं किया जा सका. ऐसा तब हो सकता है, जब डिवाइस ऑफ़लाइन हो या वह उस एपीआई के साथ काम न करता हो जिसे क्लाइंट ने कॉल करने की कोशिश की.
CANCELLED आम तौर पर, कॉलर ने कार्रवाई रद्द कर दी.
COMMAND_FAILED कमांड लागू नहीं किया जा सका. ज़्यादा जानकारी के लिए, सब-एरर कोड देखें.
CURSOR_WINDOW_NOT_SUPPORTED किसी ऐसे तरीके को कॉल किया गया है जो CursorWindow का इस्तेमाल करता है. हालांकि, CursorWindow या तो चालू नहीं है या मौजूदा संदर्भ में काम नहीं करता.
DATA_LOSS डेटा को वापस नहीं पाया जा सकता या डेटा खराब हो गया है.
DEADLINE_EXCEEDED कार्रवाई पूरी होने से पहले ही समयसीमा खत्म हो गई. सिस्टम की स्थिति में बदलाव करने वाली कार्रवाइयों के लिए, यह गड़बड़ी तब भी दिख सकती है, जब कार्रवाई पूरी हो गई हो.
DECOMMISSIONING_INELIGIBLE डिवाइस को बंद नहीं किया जा सका, क्योंकि यह बंद करने के लिए ज़रूरी शर्तें पूरी नहीं करता.
FAILED_PRECONDITION कार्रवाई को अस्वीकार कर दिया गया, क्योंकि सिस्टम उस स्थिति में नहीं है जो कार्रवाई को पूरा करने के लिए ज़रूरी है. उदाहरण के लिए, अगर OvenCavityOperationalStateTrait के stop कमांड को किसी ऐसे ओवन पर कॉल किया जाता है जो पहले से बंद है, तो आपको यह मैसेज दिख सकता है.
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 एसडीके को, ज़रूरी सभी जानकारी के बिना ही शुरू किया गया. उदाहरण के लिए, अगर क्लाइंट किसी दिए गए ट्रेट आईडी के लिए TraitFactory पाने की कोशिश करता है, लेकिन एसडीके को शुरू करते समय उस ट्रेट को शामिल नहीं किया गया था, तो यह गड़बड़ी दिखती है. Android पर होम को शुरू करना देखें .
UNAUTHENTICATED कॉलर की पहचान नहीं की जा सकती या अनुरोध में पुष्टि करने के मान्य क्रेडेंशियल नहीं हैं.
UNAVAILABLE यह सेवा उपलब्ध नहीं है. ज़्यादातर मामलों में, यह कुछ समय के लिए होने वाली समस्या होती है . इसे बैकऑफ़ के साथ फिर से कोशिश करके ठीक किया जा सकता है. ध्यान दें कि नॉन-आईडेमपोटेंट कार्रवाइयों को फिर से करने में हमेशा सुरक्षा से जुड़ी समस्याएं हो सकती हैं.
UNIMPLEMENTED अनुरोध की गई कार्रवाई, इस सेवा में लागू, काम नहीं करती या चालू नहीं है.
UNKNOWN ऐसी गड़बड़ी जिसकी कोई जानकारी नहीं है. UNKNOWN तब दिखता है, जब कोई ऐसी गड़बड़ी होती है जिसे अन्य किसी गड़बड़ी कोड का इस्तेमाल करके कैटगरी में नहीं बांटा जा सकता. उदाहरण के लिए, यह गड़बड़ी तब दिख सकती है, जब किसी बाहरी एपीआई से मिली स्थिति की वैल्यू में, गड़बड़ी की असली वजह के बारे में पूरी जानकारी न हो.
WRITE_FAILED डेटा सेव नहीं किया जा सका. ज़्यादा जानकारी के लिए, सब-एरर कोड देखें.