我在下面有一个抛出Checked Exception的方法。
public class Sample{
public String getName() throws DaoException{
//Some code
//this method contacts some third party library and that can throw RunTimeExceptions
}
}
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;
}
public class ServiceException Extends Exception{
//Some code
}
在上面的catch块中,我的DAO方法可以抛出DaoException或Any运行时异常。 但我有单一的catch块,它将捕获两者并将它们转换为Checked异常并返回。
转换是好的做法还是应该按原样抛出运行时异常?
谢谢!
答案 0 :(得分:1)
在大多数情况下,某些库抛出RuntimeException
意味着无法处理发生的情况,例如NullPointerException
。因此,当您将它们包装到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,因为它可以标记一个特殊情况,需要在将来修改代码。