我创建了一个自定义异常类的类,它包含许多重载方法
public class abcException extends Exception
{}
我有另一个类,我也导入了上面的abcException类
import com.system.error.abcException;
class fgh
{
void dhj() throws abcException //method that might throw Exception
{
try
{
}
catch(Exception bse) {
log.logError(bse.getMessage(), bse);
throw new abcException(bse.getMessage(), bse);
}
}
现在我的查询是如上面所示,它包含一个名为dhj()的方法 可能会抛出自定义异常,但为什么在catch块中我们会在记录后再次抛出异常 这是正确的做法吗?请指教。请告知是否可以有这样的事情
答案 0 :(得分:2)
这种做法是可以接受的。在创建可与SQLite和/或MySQL一起使用的数据库驱动程序时,请考虑一个示例。您的类的公共API有一个方法connect()
。让我们考虑你想要处理由于连接参数错误而无法建立连接的情况。在这里,您对SQLite和MySQL的工作方式有着根本的区别。 SQLite是一个基于文件的,你可能会抓住,例如FileNotFoundException
,而MySQL是通过网络访问的,您可以获得ConnectException
。公共API用户不想知道驱动程序深层次发生了什么,因此您只需将这些异常包装起来,让我们说MyDbDriverConnectException
更方便处理。
UPD:对于异常日志记录,日志记录和重新抛出是不好的做法,因为在多次记录一个异常时会创建情境。请阅读this great post以获取更多信息。
答案 1 :(得分:1)
如果你正在使用throws子句,你不需要在同一个方法中再次捕获它,使用该方法的客户端应该显式处理该异常或者再次将它放在throws子句中,某个时候某人应该处理它异常其他代码将无法编译。在这种情况下,我认为捕获和抛出是多余的
答案 2 :(得分:0)
如果发生例外
永远不会记录并重新抛出相同的异常。
例如:在Java servlet中,servlet方法只允许抛出ServletException或IOException
因此,如果在你的逻辑中发生了一些其他异常,你将该异常包装在ServletException中并重新抛出它。但是缓存Exception
是不好的,并且表明你对该方法中的操作并不了解。这甚至会捕获在大多数情况下不应该被捕获的RuntimeExceptions。
答案 3 :(得分:0)
log和throw通常被认为是反模式,请参阅http://today.java.net/article/2006/04/04/exception-handling-antipatterns#logAndThrow
catch (Exception e)
通常很糟糕,因为这样可以捕获不应该被捕获的RuntimeExceptions。通常我们只捕获已检查的例外。请注意,Java 7具有多包功能catch(FirstException | SecondException e)
至于捕获和重新抛出它没关系,它是异常翻译,请参阅http://www.javapractices.com/topic/TopicAction.do?Id=120