Android Studio IDE: прерывание при исключении

139

Кажется, моя Android Studio по умолчанию не хочет прерываться ни при каких исключениях. Включение прерывания для «Любого исключения» начинает нарушать работу реальных библиотек JDE. Есть ли способ заставить его прерываться только на исключениях в моем коде?

Исходя из вселенной Visual Studio, ищите здесь поведение отладки VS по умолчанию.

AlexVPerl
источник

Ответы:

207

Чтобы разбить все исключения, пойманные или невыловленные:

  1. Откройте окно Breakpoints через Run -> View Breakpoints .
  2. Появится диалоговое окно "Точки останова". На левой панели прокрутите вниз. Выберите « Любое исключение» в разделе « Точки останова исключения Java».
  3. Если выбрано Любое исключение , на правой панели настройте следующим образом:
    • Приостановить: проверено
    • Все: выбрано
    • Состояние: !(this instanceof java.lang.ClassNotFoundException)
    • Уведомления: выбраны как « Перехваченное исключение», так и « Неперехваченное исключение».

Диалог точек останова

  1. Определите фильтры, которые определяют пространства имен библиотек, на которых должен работать отладчик : Установите флажок Фильтры классов, чтобы включить фильтрацию классов ( как упомянуто @Scott Barta ). Затем нажмите кнопку ... (эллипсис), чтобы открыть диалоговое окно "Фильтры классов". Укажите шаблоны пространства имен классов, нажав кнопку Добавить шаблон(Добавить шаблон). Войти:
    • com.myapp.* (замените это префиксом пространства имен вашего приложения)
    • java.* (примечание: в соответствии с вопросом OP оставьте это, чтобы НЕ нарушать библиотеки Java)
    • android.* (как указано выше, оставьте только отладку собственного кода приложения)
    • При необходимости добавьте любые дополнительные пространства имен (например, сторонние библиотеки)

Фильтры класса

  1. Нажмите OK , затем закройте диалоговое окно Breakpoints.
CJBS
источник
6
@AndroidDev. Это не самый приятный интерфейс, особенно при использовании Visual Studio IDE. Фильтры классов предназначены для предотвращения более частой остановки приложения из-за всевозможных низкоуровневых ошибок (особенно во время инициализации приложения). В качестве примера выполните указанные выше действия, но без фильтров классов, затем запустите приложение в режиме отладки и посмотрите, что произойдет.
CJBS 05
6
@AndroidDev: Я думаю, что в этом есть смысл. По умолчанию он делает перерыв на все исключения. Вам не нужно устанавливать условия и фильтры. Однако OP специально просил фильтровать исключения (исключения в его собственном коде).
Mooing Duck
5
Как разработчик xcode / iOS и android-n00b, я не знал, что для запуска ЛЮБЫХ точек останова в студии Android нельзя щелкнуть значок воспроизведения (треугольник), чтобы запустить приложение. Вы должны запустить приложение, щелкнув значок в виде ошибки рядом с ним справа.
xaphod
@xaphod Другой способ - запустить в режиме выпуска (нажмите кнопку воспроизведения), затем, как только приложение запустится, прикрепите отладчик (нажав устройство с ошибкой - портретный прямоугольник с зеленой ошибкой в ​​правом нижнем углу значка), затем выберите отлаживаемый процесс. Это будет намного быстрее, если не отладить какой-либо код запуска приложения. См .: developer.android.com/tools/debugging/…
CJBS
Если вы используете junit (отладка при модульном тестировании), вы можете добавить фильтр классовorg.junit.*
Томас Винсент
34

Если вы откроете окно «Точки останова», у вас будет несколько вариантов, чтобы оно было условно остановлено или нет. Здесь вы ищете «фильтры классов» - вы можете указать выражение с подстановочными знаками, например, с путем к пакету Java, и оно будет нарушаться только для исключений, сгенерированных из соответствующих классов.

Скотт Барта
источник
4
Для тех, кто ищет окно точек останова, его можно найти в меню «Выполнить» -> «Просмотр точек останова».
Патрик
2
Я пытаюсь это сделать, но не могу заставить его работать. Каким должен быть фильтр классов? Могли бы привести примеры?
Барт Фридерикс,
1
Я в той же лодке - фильтры классов, похоже, мне не подходят. Я пробовал com.mycompany. *, Но ни одно из исключений не привело к его поломке.
Kylotan
Он просто останавливается в ZygoteInit.java каждый раз! Довольно бесполезно! Как это побороть ???
Renaud Cerrato
Run-> View Breakpoints .... да, мы бы не хотели, чтобы окно отображалось в меню "View", не так ли!
LarryBud
7

Чтобы разбить все исключения в вашем коде и другие исключения, если они не перехвачены:

Эти методы отфильтровывают типы исключений, которые среда выполнения генерирует во время нормальной работы (не очень ли исключительные, правда?). Он не использует фильтр классов, так как он будет фильтровать слишком много; ошибки в вашем коде часто приводят к тому, что классы среды выполнения генерируют исключения (например, доступ к списку массивов за концом).

  1. Включите Java Exception BreakPoints / Any exception только для неперехваченных исключений.

  2. Добавьте новую точку останова Java Exception BreakPoint для Exception (java.lang)класса для перехваченных и неперехваченных исключений. Включите условие и установите его так:

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

Добавьте в список исключений в условии любые другие неисключительные исключения, с которыми вы столкнетесь. (Кстати, использование java.lang.Exception- это способ эффективно получить вторую запись «Любое исключение».)

Эдвард Брей
источник
не лучше использовать! (a || b || c) вместо! (a) &&! (b) &&! (c)
ceph3us