IDE do Android Studio: quebra de exceção

138

Parece que meu Android Studio não deseja interromper nenhuma exceção por padrão. A ativação da interrupção em "Qualquer exceção" começa a ser interrompida nas bibliotecas reais do JDE. Existe alguma maneira de forçar a quebra apenas em exceções dentro do meu código?

Vindo do universo do Visual Studio, procurando o comportamento padrão de depuração do VS aqui.

AlexVPerl
fonte

Respostas:

206

Para quebrar todas as exceções, capturadas ou não capturadas:

  1. Abra a janela Pontos de interrupção em Executar -> Exibir pontos de interrupção .
  2. A caixa de diálogo Pontos de interrupção é exibida. No painel esquerdo, role para a parte inferior. Selecione Qualquer exceção em Pontos de interrupção de exceção do Java
  3. Com Qualquer exceção selecionada, no painel direito, configure da seguinte maneira:
    • Suspender: marcado
    • Todos: selecionado
    • Doença: !(this instanceof java.lang.ClassNotFoundException)
    • Notificações: exceção capturada e exceção não capturada selecionadas

Caixa de diálogo Pontos de interrupção

  1. Defina os filtros que especificam os espaços de nomes das bibliotecas nas quais o depurador deve ser quebrado: Marque a caixa de seleção Filtros de classe para ativar a filtragem de classe ( conforme mencionado por @Scott Barta ). Em seguida, clique no botão ... (reticências) para abrir a caixa de diálogo Filtros de classe. Especifique os padrões de namespace da classe clicando no botão Adicionar padrão(Add Pattern). Entrar:
    • com.myapp.* (substitua-o pelo prefixo de namespace do seu aplicativo)
    • java.* (nota: conforme a pergunta do OP, deixe isso para NÃO quebrar nas bibliotecas Java)
    • android.* (como acima, deixe de depurar apenas o código do aplicativo)
    • Adicione espaços de nome adicionais conforme necessário (por exemplo, bibliotecas de terceiros)

Filtros de classe

  1. Pressione OK e feche a caixa de diálogo Pontos de interrupção.
CJBS
fonte
6
@AndroidDev Não é a interface mais agradável, principalmente quando você usa o IDE do Visual Studio. Os filtros de classe são para impedir que todos os tipos de erros de baixo nível parem o aplicativo com muito mais frequência (especialmente durante a inicialização do aplicativo). Como exemplo, siga as etapas acima, mas sem os filtros de classe, inicie o aplicativo no modo de depuração e veja o que acontece.
CJBS
6
@AndroidDev: Eu acho que faz sentido, na verdade. Por padrão, ele não quebrar em todas as exceções. Você não precisa definir condições e filtros. No entanto, o OP solicitou especificamente a filtragem de exceções (exceções em seu próprio código).
Mooing Duck
4
Como desenvolvedor xcode / iOS e android-n00b, eu não sabia que, para que ALGUNS pontos de interrupção disparassem, no Android studio você não pode clicar no ícone de reprodução (triângulo) para iniciar o aplicativo. Você deve iniciar o aplicativo clicando no ícone de bug ao lado dele, à direita.
xaphod
@xaphod Outra maneira é executar no modo de liberação (pressione o botão play). Depois que o aplicativo for iniciado, conecte o depurador (pressionando o dispositivo com o bug - retângulo retrato com bug verde no canto inferior direito do ícone) e selecione o processo a ser depurado. Isso é muito mais rápido se não estiver depurando nenhum código de inicialização do aplicativo. Consulte: developer.android.com/tools/debugging/…
CJBS 13/16
Se você estiver usando junit (depuração, enquanto o teste de unidade), você pode querer adicionar o filtro de classeorg.junit.*
Thomas Vincent
34

Se você abrir a janela Pontos de interrupção, ele oferece várias opções para que ela seja quebrada condicionalmente ou não. O que você está procurando é os "Filtros de classe" aqui - você pode especificar uma expressão curinga com, por exemplo, um caminho de pacote Java, e isso só será interrompido para exceções geradas a partir de classes correspondentes.

Scott Barta
fonte
4
Para quem procura a janela Pontos de interrupção, ela pode ser encontrada no menu Executar -> Exibir pontos de interrupção.
Patrick
2
Estou tentando isso, mas não consigo fazê-lo funcionar. Qual deve ser o filtro de classe? Poderia dar alguns exemplos?
Bart Friederichs
1
Estou no mesmo barco - os filtros de classe simplesmente não parecem funcionar para mim. Eu tentei com.mycompany. *, Mas nenhuma das exceções causa a quebra.
Kylotan
Ele para no ZygoteInit.java sempre! Muito inútil! Como superar isso ???
Renaud Cerrato
Corra-> Exibir pontos de interrupção .... sim, não queremos que uma janela seja exibida no menu "Exibir", sim!
LarryBud
7

Para quebrar todas as exceções no seu código e outras exceções, se não forem capturadas:

Esse método filtra os tipos de exceção que o tempo de execução lança durante a operação normal (não são muito excepcionais, são?). Ele não usa o filtro de classe, pois filtraria muito; erros no seu código geralmente fazem com que as classes de tempo de execução gerem exceções (por exemplo, acessar uma lista de matrizes após o final).

  1. Ativar BreakPoints de exceção de Java / Qualquer exceção apenas para exceções não capturadas .

  2. Adicione um novo Java Exception BreakPoint à Exception (java.lang)classe para exceções capturadas e não capturadas . Ative Condition e defina-o da seguinte forma:

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

Adicione à lista de exclusão na condição quaisquer outras exceções não excepcionais que encontrar. (BTW, usar java.lang.Exceptioné uma maneira de obter efetivamente uma segunda entrada "Qualquer exceção".)

Edward Brey
fonte
! não melhor ao uso (a || b c ||) em vez de (a) && (b) && (c)!
ceph3us