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
是私有的。