IDE di Android Studio: interruzione dell'eccezione


138

Sembra che il mio Android Studio non desideri interrompere alcuna eccezione per impostazione predefinita. L'abilitazione dell'interruzione su "Qualsiasi eccezione" inizia l'interruzione all'interno delle librerie JDE effettive. C'è un modo per forzarlo a rompere solo su eccezioni all'interno del mio codice?

Proveniente dall'universo di Visual Studio, cerca qui il comportamento di debug VS predefinito.

Risposte:


206

Per interrompere tutte le eccezioni, catturate o non rilevate:

  1. Aprire la finestra Punti di interruzione tramite Esegui -> Visualizza punti di interruzione .
  2. Viene visualizzata la finestra di dialogo Punti di interruzione. Nel riquadro sinistro, scorrere verso il basso. Selezionare Qualsiasi eccezione in Breakpoint di eccezione Java
  3. Con Qualsiasi eccezione selezionata, nel riquadro destro, configurare come segue:
    • Sospensione: selezionato
    • Tutto: selezionato
    • Condizione: !(this instanceof java.lang.ClassNotFoundException)
    • Notifiche: sia eccezione catturata e fatta eccezione Uncaught selezionati

Finestra di dialogo Punti di interruzione

  1. Definire i filtri che specificano gli spazi dei nomi delle librerie su cui il debugger deve interrompere: selezionare la casella di controllo Filtri di classe per abilitare il filtro di classe ( come indicato da @Scott Barta ). Quindi fare clic sul pulsante ... (puntini di sospensione) per aprire la finestra di dialogo Filtri di classe. Specificare i pattern dello spazio dei nomi delle classi facendo clic sul pulsante Aggiungi motivo(Aggiungi pattern). Accedere:
    • com.myapp.* (sostituiscilo con il prefisso dello spazio dei nomi della tua app)
    • java.* (nota: secondo la domanda di OP, lascia perdere questa opzione per NON interrompere le librerie Java)
    • android.* (come sopra, lascia fuori solo il debug del proprio codice app)
    • Aggiungi eventuali spazi dei nomi aggiuntivi, se necessario (ad es. Librerie di terze parti)

Filtri di classe

  1. Premere OK , quindi chiudere la finestra di dialogo Punti di interruzione.

6
@AndroidDev Non è l'interfaccia più carina, specialmente quando si utilizza l'IDE di Visual Studio. I filtri di classe servono a impedire che tutti i tipi di errori di basso livello arrestino l'applicazione molto più frequentemente (specialmente durante l'inizializzazione dell'app). Ad esempio, seguire i passaggi precedenti, ma senza i filtri di classe, quindi avviare l'app in modalità debug e vedere cosa succede.
CJBS,

6
@AndroidDev: penso che abbia davvero senso. Di default non rompe su tutti eccezione. Non è necessario impostare condizioni e filtri. Tuttavia, il PO ha chiesto specificamente il filtraggio delle eccezioni (eccezioni nel suo codice).
Mooing Duck

4
Come sviluppatore xcode / iOS e android-n00b, non sapevo che per far scattare QUALUNQUE punto di interruzione, in Android Studio non è possibile fare clic sull'icona a forma di gioco (triangolo) per avviare l'app. È necessario avviare l'app facendo clic sull'icona a forma di bug accanto ad essa a destra.
xaphod,

@xaphod Un altro modo è quello di eseguire in modalità di rilascio (premere il pulsante di riproduzione), quindi una volta avviata l'app, collegare il debugger (premendo il dispositivo con il bug - rettangolo verticale con bug verde in basso a destra dell'icona), quindi selezionare il processo da sottoporre a debug. Questo è molto più veloce se non si esegue il debug di alcun codice di avvio dell'app. Vedi: developer.android.com/tools/debugging/…
CJBS

Se stai usando junit (debug durante il test unitario), potresti voler aggiungere il filtro di classeorg.junit.*
Thomas Vincent,

34

Se apri la finestra Punti di interruzione, ti offrono alcune opzioni per interromperla condizionatamente o meno. Quello che stai cercando sono i "Filtri di classe" qui: puoi specificare un'espressione jolly con, ad esempio, un percorso del pacchetto Java e si romperà solo per le eccezioni generate dalle classi corrispondenti.


4
Per chiunque cerchi la finestra Punti di interruzione, è disponibile nel menu Esegui -> Visualizza punti di interruzione.
Patrick,

2
Ci sto provando, ma non riesco a farlo funzionare. Quale dovrebbe essere il filtro di classe? Potresti fare qualche esempio?
Bart Friederichs,

1
Sono nella stessa barca - i filtri di classe non sembrano funzionare per me. Ho provato com.mycompany. * Ma nessuna delle eccezioni lo ha causato.
Kylotan,

Si ferma in ZygoteInit.java ogni volta! Abbastanza inutile! Come superarlo ???
Renaud Cerrato,

Esegui-> Visualizza i punti di interruzione .... sì, non vorremmo che una finestra fosse visualizzata nel menu "Visualizza", vero!
LarryBud,

7

Per interrompere tutte le eccezioni nel codice e altre eccezioni se non rilevate:

Questo metodo esclude i tipi di eccezione generati dal runtime durante il normale funzionamento (non molto eccezionali, vero?). Non usa il filtro di classe, poiché filtrerebbe troppo; i bug nel codice spesso causano eccezioni alle classi di runtime (ad es. l'accesso a un elenco di array oltre la fine).

  1. Abilita breakpoint di eccezione Java / Qualsiasi eccezione solo per eccezioni non rilevate .

  2. Aggiungere un nuovo BreakPoint di eccezione Java per la Exception (java.lang)classe per le eccezioni rilevate e non rilevate . Abilita condizione e impostalo su questo:

        !(this instanceof java.lang.ClassNotFoundException || this instanceof android.system.ErrnoException || this instanceof java.io.FileNotFoundException || this instanceof javax.net.ssl.SSLHandshakeException || this instanceof javax.net.ssl.SSLPeerUnverifiedException || this instanceof android.system.GaiException || this instanceof java.net.SocketTimeoutException || this instanceof java.net.SocketException || this instanceof java.security.NoSuchAlgorithmException)
    

Aggiungi all'elenco di esclusione nella condizione qualsiasi altra eccezione non eccezionale riscontrata. (A proposito, l'utilizzo java.lang.Exceptionè un modo per ottenere effettivamente una seconda voce "Qualsiasi eccezione".)


non migliore da usare! (a || b || c) invece di! (a) &&! (b) &&! (c)
ceph3us
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.