Как игнорировать определенный тип неперехваченного исключения в Eclipse?

Я использую стороннюю библиотеку в своем приложении Java. Эта сторонняя библиотека выдает пользовательское необработанное исключение при каждом запуске приложения. Исключение безвредно и используется только для внутренней регистрации в сторонней библиотеке. Поскольку это исключение не перехватывается, моя IDE Eclipse переключается в режим отладки и приостанавливает выполнение потока каждый раз, когда я запускаю приложение, чтобы сообщить мне о проблеме. Мне приходится вручную указывать Eclipse игнорировать это и каждый раз просто возобновлять отладку. Это очень раздражает. Я не могу изменить стороннюю библиотеку, чтобы решить эту проблему.

Есть ли способ указать Eclipse IDE игнорировать определенный тип неперехваченного исключения?

Я попробовал «Пошаговую фильтрацию», но (я думаю), поскольку пользовательское необработанное исключение не находится в трассировке стека, оно не отфильтровывается из отладчика. Это мой первый набег на пошаговую фильтрацию, поэтому я мог использовать ее неправильно. Вот пример трассировки стека.

Daemon Thread [Thread-13] (Suspended (exception CustomThirdPartyException)) 
    ThreadPoolExecutor$Worker.run() line: not available [local variables unavailable]   
    Thread.run() line: not available

РЕДАКТИРОВАТЬ:

Обходной путь jluzwick по использованию нашего собственного регистратора для отслеживания неперехваченных исключений после отключения всех неперехваченных исключений в Eclipse технически может работать, но он не идеален, и возможно, мы можем что-то пропустить, если наш регистратор неисправен.

Решение mazaneicha, казалось, было на правильном пути, но я не мог заставить его работать именно так, как я хотел. Это может быть связано с ошибкой пользователя с моей стороны.

У jluzwick и mazaneicha были возможные решения этой проблемы, но у Константина Комиссарчика был «правильный» ответ, заключающийся в том, что это следует вернуть создателям библиотеки для исправления. Иногда техническое решение не является правильным.


person Tansir1    schedule 01.03.2011    source источник


Ответы (6)


Тема старая, но решил немного добавить.

По крайней мере, в Eclipse Indigo: в представлении Debug Perspective->Breakpoints:

  1. Укажите точку останова для исключений (и, возможно, подклассов), на которых вы хотите сделать паузу. Это делается нажатием кнопки «Добавить точку останова исключения Java». Значок, представляющий собой букву J и восклицательный знак.
  2. Щелкните правой кнопкой мыши точку останова и выберите «Свойства точки останова».
  3. Перейти в «Фильтрация»
  4. Укажите класс или пакеты, которые вы хотите игнорировать. Это добавит их в список. Просто не забудьте снять их, чтобы обозначить, что это эксклюзив (не останавливайтесь в указанном месте)

Я обычно использую это, чтобы указать NullPointerExceptions в качестве общей точки останова исключения, но игнорировать пакеты из сторонних библиотек.

person Jeff    schedule 02.09.2011
comment
на мой взгляд, это лучший ответ, чем выбранный. отмечу, что мне не очень повезло с исключением по классам, и вместо этого мне пришлось прибегнуть к использованию исключений на основе пакетов (Eclipse Galileo). спасибо @Джефф! - person Matt Felzani; 21.06.2013
comment
Старая тема [...] И что? Перестаньте обращать внимание на идиотское нытье, которое вы можете получить, когда вносите что-то ПОЛЕЗНОЕ, ЦЕННОЕ в старую дискуссию. - person async; 05.12.2014

Я бы рекомендовал вместо этого попытаться решить это в коде. Найдите место в своем коде, где вы инициализируете эту библиотеку, и перехватите это исключение вместо того, чтобы позволить ему распространяться вверх по стеку, что не считается «нормальным» поведением.

person Konstantin Komissarchik    schedule 01.03.2011
comment
Библиотека порождает собственный пул потоков, в котором возникает это исключение. Я не могу просто обернуть инициализацию библиотеки в try/catch. У меня нет контроля над стеком вызовов, в котором возникает исключение. - person Tansir1; 01.03.2011
comment
Тогда у тебя проблемы. Я рекомендую связаться с поставщиком библиотеки и сообщить об ошибке. Даже если вы настроите сеанс отладки, чтобы игнорировать эту проблему, она все равно будет присутствовать во время выполнения/производства. Вы не можете указать среде выполнения Eclipse игнорировать неперехваченные исключения. Они идут прямо в журнал ошибок. - person Konstantin Komissarchik; 01.03.2011
comment
Это расщепление волос, но вы можете указать Eclipse игнорировать ВСЕ неперехваченные исключения. Я надеялся найти способ игнорировать один конкретный тип. Это можно сделать, перейдя в Windows->Настройки->Java->Отладка и сняв флажок Приостанавливать выполнение при необработанных исключениях. Это очень и очень плохая идея, но это можно сделать. Я не думал, что у меня есть какие-либо варианты, но я подумал, что не помешает спросить здесь. Спасибо за помощь. - person Tansir1; 01.03.2011

Вы пробовали это?

Перейдите в Окно- > Настройки- > Java- > Отладка

В разделе «Приостановить выполнение» снимите флажок «Приостанавливать выполнение при неперехваченных исключениях».

Я не уверен, что есть способ отключить определенные исключения, но я могу ошибаться. Возможно, есть плагин, который это делает.

person jluzwick    schedule 01.03.2011
comment
Как вы сказали, это не работает для конкретных исключений. Это заставляет Eclipse игнорировать их все. Я все еще хочу, чтобы он ловил все остальное, чтобы найти проблемы в моем собственном коде. - person Tansir1; 01.03.2011
comment
@ Tansir1 о ваших неперехваченных исключениях все равно будет сообщаться через ваш регистратор, хотя правильно? Если вы заметили, что выбрасывается одно из ваших собственных исключений, вы можете установить точку останова, откуда оно выбрасывается. - person jluzwick; 01.03.2011

В перспективе «Отладка» в представлении «Точки останова» щелкните «Точки останова исключений Java» (значок с маленькой буквой J и восклицательным знаком, J!). В появившемся окне «Добавить точку останова исключения Java» вы можете найти раздражающее исключение и снять флажок «Приостановить при неперехваченном исключении».

person mazaneicha    schedule 01.03.2011

Ты говоришь так, будто тебе нужна простая попытка, поймай.

 MyException e = new MyException;
 try {
       throw new e;
 } catch (MyException e) {
       e.printStackTrace();
 } 

Это позволит генерировать исключение, но проигнорирует его и позволит продолжить выполнение программы. Если вы хотите, чтобы это записывалось в файл, используйте 'PrintWriter.println(e.printStackTrace());'

Надеюсь, вы получили то, что вам нужно, и удачного кодирования!

person Galen Nare    schedule 18.05.2013
comment
См. комментарии к ответу Константина Комиссарчика. У меня не было контроля над стеком вызовов, поэтому я не мог просто так обернуть исключение. Это было в сторонней библиотеке, а не в моем собственном коде. - person Tansir1; 19.05.2013

Содействие ответу Джеффа:

В перспективе отладки щелкните правой кнопкой мыши приостановленный поток и выберите «Исключить местоположение исключения». Таким образом, Eclipse добавляет класс, на котором приостановлен поток, в список фильтрации неперехваченного исключения.

person Aron    schedule 14.11.2019