如何处理多个Route的异常

时间:2012-11-28 12:42:42

标签: java exception-handling spark-java

我正在掌握Spark Framework,我正试图了解以多种路线统一处理异常的最佳方式。

目前,我有许多所有处理例外情况的路线:

...
catch (final Exception e) {
    ...
    response.status(418);
    return e.getMessage();
}
...

这留下了很多不足之处,主要是异常逻辑在它们之间重复。我知道它可以通过重构来改进,但我想知道是否有类似于Spring中ExceptionHandler机制的东西,你可以在抛出特定异常时执行一个动作,例如:

@ExceptionHandler(Exception.class)
public void handleException(final Exception e, final HttpServletRequest request) {
    ...executed for the matching exception...
}

那么,是否存在用于异常处理的Spark-esque机制?我查了一下文档并做了简短的介绍。如果没有,我会继续我的重构计划。感谢。

2 个答案:

答案 0 :(得分:10)

你可以像这样处理异常:

get("/throwexception", (request, response) -> {
    throw new NotFoundException();
});

exception(NotFoundException.class, (e, request, response) -> {
    response.status(404);
    response.body("Resource not found");
});

取自Spark docs

的示例

答案 1 :(得分:0)

我一直在处理这个问题。这就是我提出的。它需要调整到你的环境。

public class ExceptionHandler extends MustacheTemplateHandler
{
private final WrappedHandler inter;

public abstract static class WrappedHandler
{
    public abstract Object handle(Request req, Response res);       
}

public static ExceptionHandler wrap(String path, WrappedHandler internal)
{
    return new ExceptionHandler(path, internal);
}

private ExceptionHandler(String path, WrappedHandler internal) 
{
    super(path);
    inter = internal;
}

@Override
public Object handle(Request req, Response res) 
{
    try 
    {
        return inter.handle(req, res);
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return new ModelAndView(e, "errors");
    }
}
}

然后(使用import static):

    get(wrap("/download", new DownloadHandler()));
    post(wrap("/upload", new UploadHandler()));