Java 在catch块中返回的代码是否干净?

Java 在catch块中返回的代码是否干净?,java,servlets,Java,Servlets,我有一个Javaservlet,它检查URL参数(最后一个uri部分,通配符)。给定这些参数,我想用404或实际响应来响应。执行返回是否是干净的代码在catch块中 @WebServlet("/processes/edit/*") public class ProcessEditServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)

我有一个Javaservlet,它检查URL参数(最后一个uri部分,通配符)。给定这些参数,我想用404或实际响应来响应。执行
返回是否是干净的代码在catch块中

@WebServlet("/processes/edit/*")
public class ProcessEditServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        ...

        try {
            id = StringManipulation.removeSlashes(request.getPathInfo());
            numid = Integer.parseInt(id);
        } catch (NumberFormatException e) {
            response.sendError(404);
            return;
        }

        request.getRequestDispatcher("/WEB-INF/processEdit.jsp").forward(
            request, response);
    }
}

正如狗鼻子说的,这很大程度上是个人感觉。我将重构此代码,如下所示:

@WebServlet("/processes/edit/*")
public class ProcessEditServlet extends HttpServlet {
// you may get a logger over Dependency Injection or joust create one here... 
private final Logger logger;
public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    ...


    if(validateRequest(request,logger){
    request.getRequestDispatcher("/WEB-INF/processEdit.jsp").forward(
        request, response);
    }else{
        response.sendError(404);
    }
}

public static boolean validateRequest(Request request,Logger logger){
    try {
        id = StringManipulation.removeSlashes(request.getPathInfo());
        numid = Integer.parseInt(id);
    } catch (Exception e) {
        logger.log(e); // you should at least log the exception
        return false;
    } 
    return true;
}
}
因为,它的可测试程序和整个try/catch块使代码膨胀,可读性降低——我知道人们用自己的方法封装每个try-and-catch。然而,cleancode意味着可维护和可读的代码——在我看来,当您返回一个catch时,只要它有意义就可以了


Edit1:添加了记录器

这就是我看到的代码错误:

  • 没有日志记录来告诉后来发生了什么

  • 一般例外

  • 你要把这个还给哪里?重定向到一个错误怎么样 页面


  • 但是,如果需要进一步处理,我不介意catch块中的返回。

    我非常确定,如果您在这里捕获到异常,您的return语句将导致以下代码行:

    request.getRequestDispatcher("/WEB-INF/processEdit.jsp").forward(
            request, response);
    

    不执行。如果省略return语句,即使捕获到异常,它也会执行。

    我认为,如果在代码演化后捕获更多异常并忘记return命令,则在捕获时返回可能会产生错误

    另外,在查看更具表现力的代码时,我想说您希望验证请求路径是否为数字。那么你对这个代码怎么看

    @WebServlet("/processes/edit/*")
    public class ProcessEditServlet extends HttpServlet {
    // you may get a logger over Dependency Injection or joust create one here... 
    private final Logger logger;
    
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        if(pathIsNotNumeric(request.getPathInfo())) {
            response.sendError(404);
            return;
        }
    
        request.getRequestDispatcher("/WEB-INF/processEdit.jsp").forward(request, response);
    }
    
    public boolean pathIsNotNumeric(final String pathInfo){
        boolean isNotNumeric = true;
        try {
            Integer.parseInt(StringManipulation.removeSlashes(pathInfo));
            isNotNumeric = false;
        } catch (NumberFormatException e) {
            logger.log(e); // logging the exception
        }
        return isNotNumeric;
    }
    

    有些人可能会说“啊,永远不要那样做”-有些人可能会说“是的,很酷”-如果此时返回的
    对您有效-那么就这样做@NathanHughes显然缺少验证/验证部分。无论如何,我不得不使用原始JSP,所以我想根据MVC模型使用servlet作为一种“控制器”。请随意给我一些如何正确设计此类应用程序的输入。不要捕捉异常!这还捕获所有未检查的异常(即,
    RuntimeException
    和派生)。当然,记录每个异常会更干净,我会解决这个问题,这是正确的,因为我会写一个响应。如果同时发送错误并转发,则会出现另一个异常。是的!我更想澄清使用return的含义,并让OP决定这是否是他想要的。