-3

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

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

4 回答 4

2

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

UPD:对于异常记录,记录和重新抛出是不好的做法,因为您会在多次记录一个异常时造成情况。阅读这篇精彩的文章以获取更多信息。

于 2013-01-06T07:24:46.780 回答
1

如果您正在使用 throws 子句,则无需在同一方法中再次捕获它,使用该方法的客户端应显式处理该异常或再次将其放入 throws 子句中,有时应该有人处理该异常否则代码不会编译。在这种情况下,我认为 catch 和 throw 是多余的

于 2013-01-06T07:11:59.093 回答
0

如有异常

  1. 抓住它并记录下来。或者
  2. 丢它

永远不要记录并重新抛出相同的异常。

例如:在 Java servlet 中,servlet 方法只允许抛出 ServletException 或 IOException

因此,如果在您的逻辑中发生了其他异常,则将该异常包装在 ServletException 中并重新抛出它。但是缓存它Exception是不好的,并且表明您对在该方法中所做的事情没有太多了解。这甚至会捕获在大多数情况下不应该捕获的 RuntimeExceptions。

于 2013-01-06T07:36:45.027 回答
0

log and throw 通常被认为是一种反模式,参见http://today.java.net/article/2006/04/04/exception-handling-antipatterns#logAndThrow

catch (Exception e)通常是不好的,因为这样你可以捕捉到不应该被捕捉的 RuntimeExceptions。通常我们只捕获已检查的异常。请注意,Java 7 具有 multicatch 功能catch(FirstException | SecondException e)

至于catch and rethrow就可以了,是异常翻译,见http://www.javapractices.com/topic/TopicAction.do?Id=120

于 2013-01-06T07:48:23.473 回答