我需要了解java异常处理优先级。
我有一个类Controller,它有一个NodeManager类,它有一个NameManager类。 NameManager有一个方法:
public LriNode getLriNode(...) throws HttpErrorException
{
if(condition)
throw new HttpErrorException (status);
}
NodeManager类使用以下
中的上一个方法public void nodeWriter(...) throws HttpErrorException
{
...
try
{
//this can throw an HttpErrorExeption
lriNode = nameManager.getLriNode(resourceName);
...
}
catch (HttpErrorException e)
{
if(e.getStatus().name().equals(HttpStatus.NOT_FOUND))
{
//here can be thrown an HttpErrorExeption too
do work
}
else
{
e.printStackTrace();
}
}
}
最后,类Controller使用以下
中的上一个方法@RequestMapping(method=RequestMethod.PUT, value="document/{name}")
public ModelAndView putDocument(@RequestBody String body, @PathVariable String name, HttpServletResponse response, HttpServletRequest request)
{
Source source = new StreamSource(new StringReader(body));
try
{
NodeManager.nodeWriter(...);
return new ModelAndView(XML_VIEW_NAME, "document", document);
}
catch (HttpErrorException e)
{
response.setStatus(e.getStatus().value());
e.printStackTrace();
}
return null;
}
嗯,重点是:当NameManager抛出HttpErrorException
时,我希望NodeManger的nodeWriter()
方法中的try-catch块能够执行异常。它发生的是控件返回到Controller类并执行其try-catch块。似乎throws HttpErrorException
方法中的nodeWriter()
语句优先于内部try-catch块。
有人能解释一下这样的异常处理优先系统吗?
答案 0 :(得分:1)
在您的代码中,您提到您的Controller
正在处理异常。好吧,在nodeWriter()
方法调用中,您的捕获表明可以重新抛出HttpErrorException
。
public void nodeWriter(...) throws HttpErrorException
{
...
try
{
//this can throw an HttpErrorExeption
lriNode = nameManager.getLriNode(resourceName);
...
}
catch (HttpErrorException e)
{
if(e.getStatus().name().equals(HttpStatus.NOT_FOUND))
{
//LOOK HERE!!! --> here can be thrown an HttpErrorExeption too
}
else
{
e.printStackTrace();
}
}
}
如果这可以重新使用HttpErrorException
,则调用Controller
的{{1}}将处理该异常。
答案 1 :(得分:1)
Throwable不会传播到处理该类Throwable的try / catch块之外。检查堆栈跟踪中的行号,这将告诉您Exception发生的确切位置。 (顺便提一下,一些java IDE有一个“分析堆栈跟踪”功能,允许你直接点击有问题的类和行号。我从来没有发现它有多大用处,但是这个功能存在,所以有人必须发现它很有用。 )