2012-05-17 4 views
5

Как это может быть? Похоже, что как дневной свет исключение из сторонней библиотеки пропускает мой блок catch. Не знаете, с чего начать устранение неполадок. Это либо я, действительно, глупый, либо я не понимаю ничего тонкого в исключениях и Java.Исключение Java исключение

Моя консоль:

Exception: org.apache.james.mime4j.io.MaxLineLimitException: Maximum line length limit exceeded; stack: org.apache.james.mime4j.stream.MimeEntity.readRawField(MimeEntity.java:242); org.apache.james.mime4j.stream.MimeEntity.nextField(MimeEntity.java:258); org.apache.james.mime4j.stream.MimeEntity.advance(MimeEntity.java:296); org.apache.james.mime4j.stream.MimeTokenStream.next(MimeTokenStream.java:360); me.unroll.scanner.Scanner.<init>(Scanner.java:206); me.unroll.scanner.ScannerThread.run(ScannerThread.java:205); java.lang.Thread.run(Thread.java:722)

Проблема мой код выглядит следующим образом:

try { 
//... 
for(EntityState token = messageStream.getState(); 
    token != EntityState.T_END_OF_STREAM; 
    token = messageStream.next()) { //this is Scanner.java:206 
//... 
catch(ScanComplete exc) { } 
catch(MaxLineLimitException exc) { //line 282, matches "try" above 
    debug("Am I getting caught?"); //no, it's not 

Я больше

+0

Поместите также строку отладки в блок catch Scan Complete. –

+4

Вы уверены, что уровень журнала достаточно высок, чтобы «debug» отображался? –

+2

положил точку перерыва в строке 283 и посмотрел, попадет ли он. (строка отладки) – MeBigFatGuy

ответ

5

Вы пытаетесь поймать неправильный тип исключения.

Подпись для MimeTokenStream.next() говорит, что она может бросить MimeException, которую вы не ловите. (Кстати, если вам интересно, почему исключение не поймано, вы можете попытаться поймать Exception и зарегистрировать тип исключения, чтобы посмотреть, что на самом деле бросается.)

Теперь, если вы посмотрите на исходный код для фактического источник исключения, строка 242 MimeEntity.readRawField, вы увидите:

241  } catch (MaxLineLimitException e) { 
242   throw new MimeException(e); 
243  } 

Таким образом, даже если сообщение консоли говоритMaxLineLimitException, фактическое исключение броска этот метод является MimeException. Попробуйте поймать MimeException в вашем коде вместо MaxLineLimitException, но будьте осторожны, что MimeTokenStream.next() может, вероятно, выбросить MimeException по другим причинам, кроме того, с которым вы столкнулись.

+1

Добавление к тому, что @matts - это, вероятно, некоторая обработка ошибок в корне, где он сообщает «Корневая причина», а не обернутое исключение (MimeException). Это консоль показывает exeception.getCause() не только исключение. –

1

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

1

«Несчастная переменная», вероятно, правильная. Другой вариант заключается в том, что вы импортировали неверный класс MaxLineLimitException.

Смежные вопросы