在java中,我想记录从一段代码中抛出的异常:
try
{
doRiskyThing();
}
catch(Throwable t)
{
log.warn("too bad");
throw t;
}
问题是现在我的方法必须声明它抛出throwable。
另一方面,如果我在finally块中记录异常,我怎么知道抛出了什么异常(如果任何异常被抛出)。
答案 0 :(得分:4)
你至少可以为未经检查的n catch和n catch块写一个catch来检查异常。
try{
..
}catch(RuntimeException e){
log(e);
throw e;
}catch(ExceptionException ..){
log(e);
throw e;
}
这不会改变您方法的签名。捕捉错误有点气味。那么,记录和抛出异常也是一种气味。这将重复错误消息。
高级异常处理是在JDK 7中从项目硬币中删除的功能。
答案 1 :(得分:0)
这似乎是记录异常的错误位置。在投掷时将其记录在doRiskyThing()中,或者将其记录在应该捕获的位置。
答案 2 :(得分:0)
这应该有效:
try
{
doRiskyThing();
}
catch(RuntimeException e)
{
log.warn("too bad");
throw e;
}
catch(Exception e)
{
log.warn("too bad");
throw new RuntimeException(e);
}
catch(Error e)
{
log.warn("too bad");
throw e;
}
但它很难看,而且我宁愿有一个捕获块,捕获所有内容并将其记录在应用程序的顶层,没有重新投掷。无论如何,堆栈跟踪都可以帮助您查明问题。
答案 3 :(得分:0)
捕捉Throwable本身已经是不好的做法(并且被许多代码质量检查工具标记为这样)。将它包装在RuntimeException中并重新抛出它?可怕!具有异常层次结构的重点被这破坏了。
远离检查异常的“趋势”实际上有点微妙。在架构层之间(或者例如在框架API边界),通常的做法是定义一个或多个有意义的异常类型,并在其中包装任何特定于实现的错误(例如,查看Spring或Hibernate)。
检查或不检查例外是一种风格问题。如果调用者很有可能愿意并且能够处理错误条件,那么我检查它(例如检测到并发更新),否则不选中(例如数据库连接错误)。未经检查的异常应该通过应用程序代码“冒泡”(即不被捕获)并通过显示某种错误页面/屏幕在高级别处理。
答案 4 :(得分:-1)
您可以记录Throwable,并抛出RuntimeException。
在Java中,你必须声明你的方法本身可能抛出的任何异常,因为它被认为是方法签名的一部分....也就是说,除了RuntimeException之外,它避免了这个规则。如果您愿意,RuntimeException可以将Throwable的消息作为其消息的一部分。
try
{
doRiskyThing();
}
catch(Throwable t)
{
log.warn("too bad, exception thrown: " + t.getMessage());
throw new RuntimeException("Throwable exception was thrown, message: " + t.getMessage());
}
请注意,这可能被认为是不好的做法,对于更长期的代码,建议您抛出非运行时异常并在方法的签名中定义它。