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

时间:2013-12-19 10:35:10

标签: java exception-handling

我在下面有一个抛出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异常并返回。

转换是好的做法还是应该按原样抛出运行时异常?

谢谢!

4 个答案:

答案 0 :(得分:1)

在大多数情况下,某些库抛出RuntimeException意味着无法处理发生的情况,例如NullPointerException。因此,当您将它们包装到Checked异常中时,客户端将被强制处理此类异常,这些异常无法捕获。

因此,如果有可能从某些不良情况中恢复,我只会说包装异常。

很好地使用Checked例外:

很多时候某些操作是定时操作tryConnection(duration),当持续时间超时然后可以抛出已检查的异常TimedOutException,现在客户端可以决定是否需要重试或不。因此,这有助于检查例外情况。

答案 1 :(得分:0)

您应该明确区分已检查和运行时异常

已检查:您正在向客户提供此方法调用可能导致此例外情况的机会,并且您声明了这一点,并让客户有机会正确处理此问题并提供恢复的机会

未经检查:您记录此方法可能会抛出此运行时异常,并且通常无法由客户端恢复,并演示程序或基础结构异常情况

如果你想分别捕获多种类型的异常,你可以拥有多个catch块

答案 2 :(得分:0)

  

将RuntimeException转换为Checked是不错的做法?

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

这两组程序员会给你这个问题的答案。

我的建议是权衡自己的利弊,并根据应用程序设计的要求做出自己的决定。由于我们审查该设计是不切实际的,所以没有人可以告诉你采取哪条路径......即使客观正确的路径。


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

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

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

捕捉Exception经常会导致问题/错误被扫地出现......只会出现并导致问题进入轨道。

答案 3 :(得分:0)

这取决于你的设计。如果你想同样对待运行时和DAO异常,那么我认为你做得对。

否则,如果您希望以不同方式对待它们,可以将ServiceException子类化为两个不同的异常,例如ServiceUnavailableException和CriticalServiceException。

所以这一切都取决于谁将调用getResult()以及你想提供什么样的冗长。

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

如果这是全局系统的一部分,我甚至不会在这方面处理RuntimeException,因为它可以标记一个特殊情况,需要在将来修改代码。