Как реализовать глобальную обработку исключений в приложении Raku Cro

#raku #cro

Вопрос:

Я работаю с довольно большим приложением Cro с десятками маршрутов, моделей и другой логики. На данный момент в каждом блоке маршрута есть CATCH исключение для обработки. Это не очень удобно для обслуживания, не говоря уже о работе по их добавлению. Итак, мне было интересно, есть ли лучший способ сделать это. Один CATCH обработчик в основном блоке маршрута не работает. Исключения перехватываются только в блоке маршрута, в котором они выбрасываются. Вероятно, проблема с потоковой передачей. Есть ли одно место, где я могу реализовать обработчик исключений, который получает все исключения и может обрабатывать их, не вызывая смерти приложения?

Ответ №1:

Вы можете использовать around функцию в своем route блоке, чтобы указать что-то, что охватывает все обработчики маршрутов. В документации around приведен пример использования его для обработки исключений, создаваемых всеми обработчиками маршрутов в route блоке (повторено здесь для удобства):

 my $application = route {
    around -> amp;handler {
        # Invoke the route handler
        handler();
        CATCH {
            # If any handler produces this exception...
            when Some::Domain::Exception::UpdatingOldVersion {
                # ...return a HTTP 409 Conflict response.
                conflict;
            }
        }
    }

    # Put your get, post, etc. here.
}
 

Комментарии:

1. Большое спасибо, Джонатан!