Java 如何处理本地化异常?
我似乎总是遇到一个十字路口,在那里我不知道如何处理异常而不重新抛出给调用方 有没有更好的方法来处理以下情况Java 如何处理本地化异常?,java,exception-handling,Java,Exception Handling,我似乎总是遇到一个十字路口,在那里我不知道如何处理异常而不重新抛出给调用方 有没有更好的方法来处理以下情况 private DataHandler retrieveFromGridFS(ObjectId id) throws IOException { GridFS gridFS = new GridFS(getDBReference()); GridFSDBFile out = gridFS.find(id); File temp = File.cre
private DataHandler retrieveFromGridFS(ObjectId id) throws IOException
{
GridFS gridFS = new GridFS(getDBReference());
GridFSDBFile out = gridFS.find(id);
File temp = File.createTempFile(
(String)out.getMetaData().get("productName"),
(String)out.getMetaData().get("productType"));
out.writeTo(temp);
return new DataHandler(new FileDataSource(temp));
}
上面的private
方法可以抛出IOException
这样使用这种方法:
public DataHandler retrieveProduct(String productId) throws IOException
{
ObjectId id = new ObjectId(productId);
DataHandler handler = null;
try
{
handler = retrieveFromGridFS(id);
}
catch(IOException ex)
{
logger.error(ex);
throw new IOException("A problem occurred retrieving product.");
}
return handler;
}
我被迫重新抛出,以免冒返回null的风险。这完全取决于情况
首先,您真的想将IOException
渗透到上层,还是想将下层可能发生的各种异常封装到特定于应用程序的异常中
您是否需要能够从此异常中恢复?如果不是,运行时异常是否更合适?(即使您确实需要异常是可恢复的,您是否在提供高级别声明性异常处理的环境中运行?)
使用NullObject
模式来避免返回null是否更有意义
(等:)一般来说,如果您能够响应发生的事件,则捕获异常。 例如,假设您有代码在连接失败时重试连接。然后您可能会有一个捕获IOException并重试x次的循环。上面的调用方不关心底层故障 当发生您无法处理的异常时,您不会处理它。基本上你是在推卸责任
最近,在大多数情况下,我倾向于避免将异常作为其他exc对象重新引用。我从经验中发现,在大多数情况下,它并没有真正增加价值。什么?在我看来,
retrieveProduct
只是一个方便的函数,可以执行retrieveFromGridFS
所做的任何操作,但是使用字符串作为标识符,而不是ObjectId。因此,它能引发的异常集不应该与从GridFS中检索的异常集相同吗?不要丢弃原始异常,这会使从日志文件进行调试更加困难使用抛出新的IOException(“检索产品时出现问题”)代码>+1;当然——清除根本原因是调试的一个祸根。这就是我在我的示例中展示的-我不确定你想说什么?哦,我明白了,我没有意识到retrieveProduct
是私有的。它不是,retrieveFromGridFS
是私有的。