关于抓住后抛出异常

时间:2013-01-06 07:08:21

标签: java exception

我创建了一个自定义异常类的类,它包含许多重载方法

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块中我们会在记录后再次抛出异常 这是正确的做法吗?请指教。请告知是否可以有这样的事情

4 个答案:

答案 0 :(得分:2)

这种做法是可以接受的。在创建可与SQLite和/或MySQL一起使用的数据库驱动程序时,请考虑一个示例。您的类的公共API有一个方法connect()。让我们考虑你想要处理由于连接参数错误而无法建立连接的情况。在这里,您对SQLite和MySQL的工作方式有着根本的区别。 SQLite是一个基于文件的,你可能会抓住,例如FileNotFoundException,而MySQL是通过网络访问的,您可以获得ConnectException。公共API用户不想知道驱动程序深层次发生了什么,因此您只需将这些异常包装起来,让我们说MyDbDriverConnectException更方便处理。

UPD:对于异常日志记录,日志记录和重新抛出是不好的做法,因为在多次记录一个异常时会创建情境。请阅读this great post以获取更多信息。

答案 1 :(得分:1)

如果你正在使用throws子句,你不需要在同一个方法中再次捕获它,使用该方法的客户端应该显式处理该异常或者再次将它放在throws子句中,某个时候某人应该处理它异常其他代码将无法编译。在这种情况下,我认为捕获和抛出是多余的

答案 2 :(得分:0)

如果发生例外

  1. 抓住并记录下来。 或
  2. 扔掉它
  3. 永远不会记录并重新抛出相同的异常。

    例如:在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