我使用普通JDBC将文件行插入数据库。为此,我使用了Guava' LineProcessor
以及Closer
。但是,该接口只能使用其方法IOException
抛出processLine(String)
。
当抛出SQLException
时,这感觉不对。到目前为止,我将SQLException
包装在未经检查的异常中,但我想知道是否不应将其包装在IOException
中,因为界面没有提及有关另一个异常的任何内容。简单地回复假?这似乎比任何事都更糟糕。
从技术上讲,我认为Guava团队的疏忽是不明确提到在wiki或Javadoc中发生检查异常时的预期行为。
那么当我遇到检查过的异常时,我应该如何实际使用LineProcessor
?
答案 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
。