繁体   English   中英

将RuntimeException转换为Checked是一种好习惯吗?

[英]Is it good practice to convert RuntimeException to Checked?

我在下面的类中有一种抛出Checked Exception的方法。

public class Sample{

 public String getName() throws DaoException{

  //Some code
   //this method contacts some third party library and that can throw RunTimeExceptions

}

}

DaoException.java

public class DaoException Extends Exception{
 //Some code


}

现在在另一个类中,我需要在方法上方调用并处理异常。

public String getResult() throws ServiceException{
  try{
  String result = sample.getName();
   //some code
  }catch(Exception e){
     throw new ServiceException(e)
   }
  return result;
}

ServiceException.java

public class ServiceException Extends Exception{
     //Some code


    }

在上面的catch块中,我的DAO方法可以引发DaoException或Any运行时异常。 但是我有一个catch块,它将捕获两个并将它们转换为Checked异常并返回。

转换是一种好习惯,还是应该按原样抛出运行时异常?

谢谢!

在大多数情况下,某些库引发RuntimeException意味着无法处理发生的条件,例如NullPointerException 因此,当您将它们包装到Checked异常中时,客户端将被迫处理毫无意义的异常。

因此,我想说的只有在某些情况下可以从某些不良情况中恢复过来时才包装异常。

很好地使用Checked异常:

很多时候,某些操作是定时操作tryConnection(duration) ,当持续时间超时时,可以抛出一个TimedOutException异常TimedOutException ,现在客户端可以决定是否需要重试。 因此,这达到了检查异常的目的。

您应该清楚地将检查和运行时异常分开

已检查 :您正在给客户机会这种方法调用可能导致这种特殊情况,并且您声明了这一点,并给了客户机会适当地处理此问题并给予了恢复的机会

未选中 :您记录此方法可能引发运行时异常,并且通常无法由客户端恢复,并说明程序或基础结构异常情况

如果要单独捕获多种类型的异常,则可以有多个catch块

将RuntimeException转换为Checked是一种好习惯吗?

有两种Java程序员:那些认为检查异常是一件好事,以及那些认为它们是坏事的人。

这两组程序员会给您相反的答案。

我的建议是权衡自己的利弊,并根据应用程序设计的需求做出自己的决定。 既然是不切实际的我们审查设计,没有人可以告诉你该走的路......就算一个客观正确的路径。


话虽如此,您的问题包括一个危险的 (IMO)编程实践示例。

...
} catch (Exception e) {
   throw new ServiceException(e)
}

当捕获Exception ,您将捕获所有可能的异常(除了应该(几乎)永远不应该捕获的Error异常)。 如果您捕获的异常是(例如)NPE导致代码中的错误……而您应该允许传播(或记录)该怎么办? 如果这是您可以并且应该从...中恢复或以其他方式处理的检查异常,该怎么办?

捕获Exception通常会导致问题/错误被掩盖在地毯下……只会出现并引起问题。

这实际上取决于您的设计。 如果您想同时对待运行时异常和DAO异常,那么我认为您做对了。

否则,如果要区别对待它们,可以将ServiceException分为两个不同的异常,例如ServiceUnavailableException和CriticalServiceException。

因此,这完全取决于谁将调用getResult()以及您想要提供的详细程度。

如果这是您要公开的服务,我将处理RuntimeExceptions。 (许多框架允许未捕获异常的通用处理机制)而不是将奇怪的错误返回给用户。

如果这是全局系统的一部分,我什至不会在这方面处理RuntimeException,因为它可能标志着一种特殊情况,需要通过将来的代码更改来解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM