Android Studio IDE: Break on Exception

138

Parece que mi Android Studio no quiere romper ninguna excepción por defecto. Habilitar la interrupción en "Cualquier excepción" comienza a interrumpirse dentro de las bibliotecas JDE reales. ¿Hay alguna forma de forzarlo a que se rompa solo en excepciones dentro de mi código solamente?

Procedente del universo de Visual Studio, buscando aquí el comportamiento de depuración VS predeterminado.

AlexVPerl
fuente

Respuestas:

206

Para romper todas las excepciones, atrapadas o no capturadas:

  1. Abra la ventana Puntos de interrupción mediante Ejecutar -> Ver puntos de interrupción .
  2. Aparece el cuadro de diálogo Puntos de interrupción. En el panel izquierdo, desplácese hasta la parte inferior. Seleccione Cualquier excepción en Puntos de interrupción de excepción de Java
  3. Con Cualquier excepción seleccionada, en el panel derecho, configure de la siguiente manera:
    • Suspender: marcado
    • Todos: seleccionados
    • Condición: !(this instanceof java.lang.ClassNotFoundException)
    • Notificaciones: tanto Atrapados excepción y la excepción no capturada seleccionados

Diálogo de puntos de interrupción

  1. Defina filtros que especifiquen espacios de nombres de bibliotecas en las que el depurador debe romper: marque la casilla de verificación Filtros de clase para habilitar el filtrado de clases ( como lo menciona @Scott Barta ). Luego haga clic en el botón ... (puntos suspensivos) para abrir el cuadro de diálogo Filtros de clase. Especifique los patrones de espacio de nombres de clase haciendo clic en el botón Agregar patrón(Agregar patrón). Entrar:
    • com.myapp.* (reemplácelo con el prefijo de espacio de nombres de su aplicación)
    • java.* (nota: según la pregunta de OP, deje esto para que NO se rompa en las bibliotecas de Java)
    • android.* (como se indicó anteriormente, deje de depurar solo el código de la aplicación)
    • Agregue espacios de nombres adicionales según sea necesario (por ejemplo, bibliotecas de terceros)

Filtros de clase

  1. Presione OK , luego cierre el cuadro de diálogo Puntos de interrupción
CJBS
fuente
66
@AndroidDev No es la mejor interfaz, especialmente cuando se usa el IDE de Visual Studio. Los filtros de clase son para evitar que todo tipo de errores de bajo nivel detengan la aplicación con mucha más frecuencia (especialmente durante la inicialización de la aplicación). Como ejemplo, siga los pasos anteriores, pero sin los filtros de clase, inicie la aplicación en modo de depuración y vea qué sucede.
CJBS
66
@AndroidDev: Creo que tiene sentido en realidad. Por defecto se hace romper en toda excepción. No tiene que establecer condiciones y filtros. Sin embargo, el OP solicitó específicamente el filtrado de excepciones (excepciones en su propio código).
Mooing Duck
44
Como desarrollador de xcode / iOS y android-n00b, no sabía que para que se activara CUALQUIER punto de interrupción, en el estudio de Android no puede hacer clic en el icono de reproducción (triángulo) para iniciar la aplicación. Debe iniciar la aplicación haciendo clic en el ícono similar a un error que se encuentra a la derecha.
xaphod
@xaphod Otra forma es ejecutar en modo de liberación (presione el botón de reproducción), luego, una vez que la aplicación se haya iniciado, conecte el depurador (presionando el dispositivo con el error - rectángulo vertical con error verde en la parte inferior derecha del icono), luego seleccione El proceso a depurar. Esto es mucho más rápido si no se depura el código de inicio de la aplicación. Ver: developer.android.com/tools/debugging/…
CJBS
Si está usando junit (depuración durante la prueba de la unidad), es posible que desee agregar el filtro de claseorg.junit.*
Thomas Vincent
34

Si abre la ventana Puntos de interrupción, le ofrece varias opciones para que se rompa condicionalmente o no. Lo que está buscando son los "Filtros de clase" aquí: puede especificar una expresión comodín con, por ejemplo, una ruta de paquete Java, y solo se romperá para las excepciones generadas a partir de clases coincidentes.

Scott Barta
fuente
44
Para cualquiera que busque la ventana de puntos de interrupción, puede encontrarla en el menú Ejecutar -> Ver puntos de interrupción.
Patrick
2
Estoy intentando esto, pero no puedo hacer que funcione. ¿Cuál debería ser el filtro de clase? ¿Podría dar algunos ejemplos?
Bart Friederichs
1
Estoy en el mismo barco, los filtros de clase simplemente no parecen funcionar para mí. He intentado com.mycompany. * Pero ninguna de las excepciones hace que se rompa.
Kylotan
¡Simplemente se detiene en ZygoteInit.java cada vez! ¡Bastante inútil! ¿Cómo superar eso?
Renaud Cerrato
Ejecutar-> Ver puntos de interrupción ... sí, no queremos que se muestre una ventana en el menú "Ver", ¿verdad?
LarryBud
7

Para romper todas las excepciones en su código y otras excepciones si no se detecta:

Este método filtra los tipos de excepción que arroja el tiempo de ejecución durante el funcionamiento normal (no muy excepcionales, ¿verdad?). No usa el filtro de clase, ya que filtraría demasiado; los errores en su código a menudo hacen que las clases de tiempo de ejecución arrojen excepciones (por ejemplo, acceder a una lista de matriz más allá del final).

  1. Habilitar Java puntos de interrupción de excepción / Cualquier excepción para no capturadas únicas excepciones.

  2. Agregue un nuevo Java Exception BreakPoint para la Exception (java.lang)clase para excepciones capturadas y no capturadas . Habilite Condición y configúrelo así:

        !(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)
    

Agregue a la lista de exclusión en la condición cualquier otra excepción no excepcional que encuentre. (Por cierto, el uso java.lang.Exceptiones una forma de obtener efectivamente una segunda entrada "Cualquier excepción").

Edward Brey
fuente
! No es mejor el uso (a || b || c) en lugar de (a) && (b) && (c)!!!
ceph3us