2009-11-19 6 views
5
class MyController { 
    def myAction = { 
     throw new MyException("Test") 
    } 
} 

Возможно ли уловить/обработать исключение, указанное выше кодом? Следующее url-mapping kinda работает, но оно заставляет исключение регистрироваться, что раздражает, потому что в моем случае я могу справиться с этим.Можно ли поймать/обработать исключения, выброшенные из контроллера Grails? Aop?

"500"(controller: "error", action: 'myExceptionHandler', exception: MyException) 

Почему я не обертываю код, который может вызвать исключение в try/catch? Ну, у меня есть несколько действий, которые могут вызвать одно и то же исключение. Обертывание каждого из них в try/catch нарушает принцип DRY.

ответ

1

В Grails может быть более «правильный» способ, но напишите метод, который принимает замыкание и обрабатывает исключение, если это необходимо. Тогда ваш код будет что-то вроде:

class MyController { 
    def myAction = { 
     handleMyException { 
     throw new MyException("Test") 
     } 
    } 
} 

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

+0

Thank в! Это не совсем так, как я хочу, но это избавиться от try/catch. – Kimble

2

Существует способ иметь общую обработку исключений с использованием Grails.

Во-первых, в файле UrlMapping вы можете объявить отображения следующим образом:

"500" (controller: "foo", action: "bar", exception: FooBarException) 

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

Если вы не хотите получать сообщения об ошибках, вы можете прибегнуть к плагину. Он должен появиться после того, как в Google появится «декларативная обработка исключений + грабли».

Лично я использую следующий подход: я направляю все аномальные исключения в ErrorController. Там у меня есть доступ к запросу ["exception"] и некоторые дополнительные параметры, такие как исходный контроллер и действие (я помещал эту информацию в карту атрибутов запроса вручную, используя фильтр before). Я не решаюсь предпринять соответствующие шаги - обычно вызывая некоторые действия над исходным контроллером, скажем fatalError.

5

Как насчет этого удивительного узора. человек

http://grails.1312388.n4.nabble.com/Possible-to-get-the-errorhandler-calling-a-controller-closure-td1354335.html

class UrlMappings { 
    static mappings = { 
     "/$controller/$action?/$id?" { 
      constraints { // apply constraints here } 
     } 
    "500"(controller:'system', action:'error') 
} 

class SystemController { 
    def error = { 
     // Grails has already set the response status to 500 

     // Did the original controller set a exception handler? 
     if (request.exceptionHandler) { 
      if (request.exceptionHandler.call(request.exception)) { 
       return 
      }   
      // Otherwise exceptionHandler did not want to handle it 
     }  
     render(view:"/error")   
    } 
} 

class MyAjaxController { 

    def beforeInterceptor = { 
     request.exceptionHandler = { ex -> 
      //Do stuff   
      return true 
     } 
    } 

    def index = { 
     assert false 
    } 
} 
+0

SystemController для обработки исключений ... красивый! –

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