Java 在catch块中返回的代码是否干净?
我有一个Javaservlet,它检查URL参数(最后一个uri部分,通配符)。给定这些参数,我想用404或实际响应来响应。执行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)
返回是否是干净的代码代码>在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决定这是否是他想要的。