2014-12-19 20 views
7

Nếu bạn đặt này trong một hành động điều khiển:Tại sao Grails loại trừ các trường hợp ngoại lệ của tôi?

def inner = new RuntimeException("inner") 
def middle = new Exception("middle", inner) 
def outer = new IllegalArgumentException("outer", middle) 
throw outer 

trang lỗi debug Grails' (và quan trọng nhất, các bản ghi) sẽ chỉ hiển thị các lớp ngoại lệ bên trong và sứ điệp của nó:

Lỗi 500 : Internal server Error

URI:/...
class: java.lang.RuntimeException
nhắn: nội

Đây là vấn đề, bởi vì khi bạn chọn để quấn một ngoại lệ với một thông điệp mô tả nhiều hơn, hầu hết các lần đó là thông điệp bên ngoài đó là quan trọng hơn trong gỡ lỗi vấn đề này.

Thực ra, sẽ hữu ích nếu có tất cả ngoại lệ trong chuỗi nguyên nhân, với tên lớp, thông báo và theo dõi ngăn xếp của chúng, giống như Java thông thường.

Tôi đã tự in bản thân ngoại lệ trong trang lỗi, nhưng việc xóa bỏ xảy ra trước khi chế độ xem lỗi được gọi.

Có thông số cấu hình nào đó có thể thay đổi hành vi này không?

Chỉnh sửa: Tôi đã posted a bugstarted a mailing list thread, nhưng cho đến nay tôi chưa tìm được cách giải quyết, thậm chí không phải là nơi trong mã nguồn Grails, nơi việc loại bỏ này xảy ra.

Trả lời

0

Tôi đã tìm thấy nơi ngoại lệ bị tước.

Đó là trong org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver.resolveException() trong đó kêu gọi các phương pháp sau đây:

protected Exception findWrappedException(Exception e) { 
    if ((e instanceof InvokerInvocationException)||(e instanceof GrailsMVCException)) { 
     Throwable t = getRootCause(e); 
     if (t instanceof Exception) { 
      e = (Exception) t; 
     } 
    } 
    return e; 
} 

này kiểm tra cho dù ngoại lệ hiện nay là một InvokerInvocationException hoặc GrailsMVCException, đó là trường hợp khi nó lớn lên theo mã người sử dụng bên trong một bộ điều khiển, và sau đó ném tất cả các ngoại lệ bên ngoài thông qua getRootCause()

Đây rõ ràng là lỗi.

Tôi cũng thấy rằng ngoại lệ ban đầu có thể được tìm thấy trong request."javax.servlet.error.exception"

1

Hãy thử this:

Bạn có thể hoàn toàn vô hiệu hóa stacktrace lọc bằng cách thiết lập grails.full.stacktrace tài sản ảo để "true" tức là thêm -Dgrails.full.stacktrace = lựa chọn đúng với kịch bản khởi động ứng dụng của bạn .

+1

Không. Nó làm cho stacktrace lâu hơn nhiều, nhưng thông điệp trên vẫn là "bên trong" thay vì "bên ngoài". – Tobia

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