我们应该在关闭缓冲流时忽略IOException吗?

时间:2015-04-24 09:08:31

标签: java bufferedreader

我加载了一个xml内容,并将其保存到磁盘上。然后我读了它,并尝试解析。 当我成功解析xml时,我应该忽略7行中的IOException吗?

 catch (IOException ignore) {}

或者可能会出现一些问题?

private HashMap <String, VideoDto> loadContent(String url){
    try {
        BufferedInputStream bStream = httpGateway.loadContents();
        cachedContent = xmlParser.parseVideos(bStream);
        try {
            bStream.close();
        } catch (IOException ignore) {}
        return cachedContent;
    } catch (XMLStreamException e) {
        throw new IllegalStateException("I/O error during integration", e);
    }
}


public BufferedInputStream loadContents() {
    URL source = config.getContentPath();
    URL target= config.getLastImportedFile();
    try {
        ReadableByteChannel rbc = Channels.newChannel(source.openStream());
        FileOutputStream fos = new FileOutputStream(target.getFile());
        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
    } catch (MalformedURLException e) {
        throw new IllegalArgumentException("Wrong url format", e);
    } catch (IOException e) {
        throw new IllegalArgumentException("I/O error while saving "+target, e);
    }

   return createBufferStream(config.getLastImportedFile());
}

private BufferedInputStream createBufferStream(URL url){
    try {
        return new BufferedInputStream(url.openConnection().getInputStream());
    } catch (IOException e) {
        throw new IllegalArgumentException(e);
    }
}

5 个答案:

答案 0 :(得分:2)

这个问题有三个部分:

Q1:是否应该忽略(压缩)异常?

我认为答案是......&#34;它取决于&#34;。

如果异常原因已知并且您可以准确地捕获它(即没有捕获具有不同原因的异常)并且正确的事情是忽略它然后...... IMO ...是的它是可接受的。< / p>

否则。否。

Q2:在这种情况下IOException意味着什么,重要吗?

答案是它一点也不清楚。在正常情况下,在关闭输入流时不会期望IOException,并且很难知道它可能意味着什么。直觉上它可能是无害的。另一方面,如果你不知道什么可能会引起什么,很难说它是否重要。

问题3:您是否应该忽略此IOException?

我会说不。但我会像这样处理它:

    } catch (IOException ex) {
        // possibly log the exception here.
        throw new AssertionError("Unexpected exception", ex);
    }

理由是,如果发生了一些完全出乎意料 的事情,那么如果开发人员/维护人员能够找到并弄清楚如何处理它将是一件好事。

另一方面,如果您可以进行先验评估,任何IOException此处无害,那么只需记录(甚至压缩)就足够了。

答案 1 :(得分:0)

永远不要忽视异常,即使没有出错。这是虫子的种子。

如果你不需要做任何动作,那么你想要做的就是打印它的堆栈跟踪。

e.printStackTrace();

您可以随时忽略它,但从长远来看可能对您有帮助。

答案 2 :(得分:0)

使用自Java 7以来存在的try语法:

try (BufferedInputStream bStream = httpGateway.loadContents();) {
    cachedContent = xmlParser.parseVideos(bStream);
}

使用此功能,您无需手动拨打.close()

应该捕获try块中抛出的所有异常。

答案 3 :(得分:0)

这意味着该流(可能)仍然是开放的,无论这是您程序中的问题,只有您知道。至少你应该记录异常,否则你可能会得到难以察觉的奇怪结果。

您可能还想查看不会造成这种困境的$('#gameid')语法:

try-with-resources

答案 4 :(得分:0)

在Effective Java中,Joshua Bloch将此作为您可能想要记录和忽略的异常的示例。然而,他说,一般来说,你想做的不仅仅是记录异常。