# त्रुटि प्रबंधन और लॉगिंग

> अपवादों के फ़नल के रूप में Debug.handle, विशिष्ट त्रुटियों पर प्रतिक्रिया और उपयोगकर्ता को विफलताएँ दिखाना।

Source: https://crossfly.dev/hi/docs/best-practices/tratamento-de-erros-e-logging — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# त्रुटि प्रबंधन और लॉगिंग

केंद्रीय बिंदु है अपवादों का **एक एकल फ़नल** रखना और "जो त्रुटि उपयोगकर्ता देखता है" को "लॉग के लिए त्रुटि" से
अलग करना।

## फ़नल: `Debug.handle(e)` और `Debug.log(...)`
```java
try {
   arriscado();
} catch (Exception e) {
   Debug.handle(e);        // एक समान रूप से लॉग और हैंडल करता है (एकल फ़नल)
}
Debug.log("estado:", valor);   // मुक्त निदान
```
फ्रेमवर्क के एनिमेशन और tasks पहले से ही `Debug.handle` के माध्यम से आंतरिक रूप से `Throwable` को कैप्चर करते हैं।
**फ़नल क्यों:** **paint thread पर** एक असंभाला अपवाद फ़्रेम को गिरा देता है — इसे चैनल करना क्रैश से बचाता है और
इंस्ट्रूमेंट करने के लिए एक एकल बिंदु देता है।

## विशिष्ट त्रुटियों पर प्रतिक्रिया करें (सब कुछ निगलें नहीं)
```java
try (SqliteDb db = SqliteDb.open("app.db")) {
   db.execute("INSERT INTO cliente(email) VALUES(?)", email);
} catch (SqliteException e) {
   if (e.code == Sqlite.CONSTRAINT) Hint.show("E-mail já cadastrado", 2000);   // 19
   else if (e.code == Sqlite.BUSY)  Hint.show("Banco ocupado, tente de novo", 2000);  // 5
   else Debug.handle(e);
}
```
`SqliteException.code` SQLite कोड लाता है (`Sqlite.OK/BUSY/CONSTRAINT/LOCKED/...`)। यही अन्य टाइप किए गए
परिणामों के लिए भी लागू होता है (उदा.: बायोमेट्रिक्स का `AuthResult.ERROR`)।

## बैकग्राउंड callbacks की त्रुटियाँ → `onUI` के साथ UI में दिखाएँ
Callbacks (नेटवर्क, GPS, BLE) paint thread के **बाहर** चलते हैं। उपयोगकर्ता को सूचित करने के लिए, `onUI` के साथ
marshal करें:
```java
new Thread(() -> {
   try { sincronizar(); }
   catch (Exception e) {
      Component.onUI(() -> Hint.show("Falha ao sincronizar", 2000));   // Hint = अवरोधक नहीं
      Debug.handle(e);
   }
}).start();
```
- गैर-अवरोधक चेतावनियों के लिए **`Hint.show(...)`**; जब उपयोगकर्ता के निर्णय की आवश्यकता हो तब **`Alert`**।
- **अलग करें:** उपयोगकर्ता को क्या देखना चाहिए (`Hint`/`Alert`) बनाम जो केवल लॉग में जाता है (`Debug.log`/`handle`)।

## डिबग फ़्लैग
`Debug.traceKeyboard`, `Debug.showFPS`, `Debug.beepOnGC` विकास के दौरान निदान करने में मदद करते हैं।

## अच्छी प्रथाएँ
- जो विशेष रूप से संभालने योग्य नहीं है उसके लिए **एक फ़नल** (`Debug.handle`)।
- **विशिष्ट** कोड (`CONSTRAINT`, `BUSY`) को उपयोगकर्ता के लिए उपयोगी संदेश के साथ संभालें।
- बैकग्राउंड त्रुटि → `onUI` + `Hint`/`Alert`; callback में कभी सीधे UI को न छुएँ।

## आम गलतियाँ
- खाली `catch (Exception e) {}` — समस्या को निगल लेता है।
- उपयोगकर्ता को कच्चा stack trace दिखाना (स्पष्ट संदेश के साथ `Hint`/`Alert` का उपयोग करें; stack लॉग में जाता है)।
- `onUI` के बिना बैकग्राउंड थ्रेड से UI को छूना।

## यह भी देखें
- [डायलॉग और मोडल](/docs/ui/navigation/dialogs-and-modals) · [बैकग्राउंड में काम](/docs/data-and-services/background-work)
