检查异常发生时如何使用LineProcessor?

时间:2014-02-24 13:19:58

标签: guava

我使用普通JDBC将文件行插入数据库。为此,我使用了Guava' LineProcessor以及Closer。但是,该接口只能使用其方法IOException抛出processLine(String)

当抛出SQLException时,这感觉不对。到目前为止,我将SQLException包装在未经检查的异常中,但我想知道是否不应将其包装在IOException中,因为界面没有提及有关另一个异常的任何内容。简单地回复假?这似乎比任何事都更糟糕。

从技术上讲,我认为Guava团队的疏忽是不明确提到在wiki或Javadoc中发生检查异常时的预期行为。

那么当我遇到检查过的异常时,我应该如何实际使用LineProcessor

2 个答案:

答案 0 :(得分:1)

SQLException包装到IOException是一个有效的解决方案,因为您正在从文件(输入)读取并写入数据库(输出)。 IOException的根本原因是SQLException

虽然在文档中你是正确的,因为它只提到LineProcessor意味着与readLines方法一起使用。它没有明确说明发生异常时预期的行为。但是,readLines的文档提到在发生I / O错误时应抛出IOException

请注意,LineProcessor还可以收集结果并使用LineProcessor#getResult方法返回,因此您可以始终完全读取该文件,返回结果(如果你的文件不是太大)。这将允许您分割读取/处理行和在数据库中插入数据的职责。

答案 1 :(得分:1)

这是所有基于回调的API都具有已检查异常的问题。您可以使回调能够抛出任何类型的Exception,但是使用回调的方法也必须抛出Exception,这对用户来说是一种痛苦(特别是如果实际的回调没有抛出任何异常!)。您还可以使用一种经过检查的异常(例如LineProcessor<T, X extends Throwable>)对回调进行参数化,并使其上的方法能够抛出X,但如果有两种或三种类型的已检查异常,它会怎样?扔?这只是一团糟。

在这种情况下,允许IOException因为A)它是大多数回调需要抛出的最可能的异常类型,B)(更重要的是)使用LineProcessor的方法(例如,CharStreams.readLines(Readable, LineProcessor<T>)已经必须能够抛出IOException,因为它们执行I / O,因此如果LineProcessor也可以抛出IOException,则不会给用户带来额外的负担。

处理这个问题的最简单方法可能只是创建一个UncheckedSQLException类,其原因必须是SQLException,然后从LineProcessor中抛出并抓住它并在任何地方解开它你使用LineProcessor