2014-12-19 2 views
7

Если поместить это в действии контроллера:Почему Грайль лишает моих исключений?

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

ошибка отладки страницы Grails' (и самое главное, журналы) покажет только внутренний класс исключений и его сообщение:

Ошибка 500 : Internal Server Error

URI:/...
Класс: java.lang.RuntimeException
Сообщение: внутреннего

Это проблематично, потому что, когда вы выбираете, чтобы обернуть исключение с более описательным сообщением, в большинстве случаев это внешнее сообщение, что более важно при отладке проблемы.

На самом деле было бы полезно иметь все исключения в цепочке причин с их именем класса, трассировкой сообщений и стека, как это делает обычная Java.

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

Есть ли параметр конфигурации, который может изменить это поведение?

Редактировать: У меня есть posted a bug и started a mailing list thread, но до сих пор я не нашел обходного пути и даже места в исходном коде Grails, где происходит эта зачистка.

ответ

0

Я нашел место, где исключены исключения.

Это в org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver.resolveException() который вызывает следующий метод:

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; 
} 

Это позволит проверить текущее исключение, является ли InvokerInvocationException или GrailsMVCException, который является тем случаем, когда он поднят пользовательским кодом внутри контроллера, а затем броски от всех внешних исключений до getRootCause()

Это явно ошибка.

Я также обнаружил, что оригинальное исключение можно найти в request."javax.servlet.error.exception"

1

Попробуйте this:

Вы можете полностью отключить фильтрацию StackTrace, установив grails.full.stacktrace VM свойство «истина», то есть добавить -Dgrails.full.stacktrace = True параметр в скрипт запуска приложения ,

+1

Nope. Это делает stacktrace намного дольше, но верхнее сообщение по-прежнему остается «внутренним», а не «внешним». – Tobia

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