2012-05-17 40 views
5

Làm cách nào để thực hiện điều này? Trông giống như ánh sáng ban ngày, ngoại lệ từ thư viện của bên thứ ba đang bỏ qua khối catch của tôi. Không chắc chắn nơi để bắt đầu xử lý sự cố này. Đó là hoặc là tôi thực sự ngu ngốc, hoặc tôi không hiểu một cái gì đó tinh tế về ngoại lệ và Java.Ngoại lệ Java không bị bắt gặp

console của tôi:

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)

Vấn đề là mã của tôi trông như thế này:

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 

tôi hơn

+0

Đặt một dòng gỡ lỗi trong khối catch ScanComplete. –

+4

Bạn có chắc là mức nhật ký đủ cao để 'debug' hiển thị? –

+2

đặt điểm ngắt trên đường 283 và xem nó có bị trúng hay không. (dòng gỡ lỗi) – MeBigFatGuy

Trả lời

5

Bạn đang cố gắng nắm bắt loại ngoại lệ sai.

Chữ ký cho MimeTokenStream.next() cho biết nó có thể ném MimeException mà bạn không bắt được. (BTW nếu bạn tự hỏi tại sao ngoại lệ không bị bắt, bạn có thể thử bắt số Exception và ghi lại loại ngoại lệ để xem những gì thực sự bị ném.)

Bây giờ, nếu bạn nhìn vào mã nguồn cho thực tế nguồn gốc của sự ngoại lệ, dòng 242 của MimeEntity.readRawField, bạn sẽ thấy:

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

Vì vậy, mặc dù giao diện điều khiển thông điệp nóiMaxLineLimitException, ngoại trừ thực tế bị ném bằng phương pháp đó là một MimeException. Hãy thử bắt số MimeException trong mã của bạn thay vì MaxLineLimitException, nhưng hãy cẩn thận rằng MimeTokenStream.next() có thể ném MimeException vì các lý do khác ngoài lý do bạn gặp phải.

+1

Một phụ lục cho những gì @matts là có lẽ là một số loại xử lý ngoại lệ gốc, nơi nó báo cáo "Nguyên nhân gốc" và không phải là ngoại lệ được bao bọc (MimeException). Đó là giao diện điều khiển đang hiển thị exeception.getCause() không chỉ là ngoại lệ. –

1

Một khả năng được rằng ngoại lệ đã đăng nhập, sau đó bị bắt và không bị lật đổ. Bạn có thể đặt một điểm ngắt trên bản thân ngoại lệ và bước ra khỏi đó cho đến khi bạn đạt đến phương pháp của mình.

1

'Biến số khốn khổ' có lẽ đúng. Một tùy chọn khác là bạn đã nhập sai lớp MaxLineLimitException.

Các vấn đề liên quan