“忽略或只是记录通常是一个坏主意。这并没有回答这个问题。对于来自 close() 的 IOException,应该怎么做?只是重新推翻它只会把问题推得更远,在那里它甚至更难处理。
理论
直接回答您的问题:当此 IO 操作失败时,根据具体情况,您可能希望
- 回滚更改(不要在磁盘上保留部分写入的文件,请将其删除)
- 重试(可能在回滚后)
- 忽略(并继续)
- 中断当前任务(取消)
您通常可以在向用户显示的对话框中看到最后 3 个对话框。实际上,将选择委托给用户是一种可能性。
我认为重点是不要让系统处于不一致的状态。只是吞下一个关闭的异常可能会给你留下一个残缺的文件,导致以后的令人讨厌的错误。
实践
使用已检查的异常有点麻烦。出现以下选项:
有关 IO monad 的更多信息
当您在 IO monad 上下文中返回结果时,您实际上并不是在执行 IO 操作,而是返回该操作的描述。为什么?这些操作有一个API,它们可以很好地组成(而不是投掷/尝试/捕获大屠杀)。
您可以决定是否要执行检查异常样式处理(使用或不安全的PerformIO'调用(实际执行组合的IO操作)。Option
Validation˙ in the return type), or dynamic style handling, with bracketing only on the final
要了解一些想法,请参阅我的Scala要点 http://gist.github.com/2709535,它托管了该方法。它返回资源处理的结果(如果可用)和未关闭的资源(如果关闭失败)。然后由用户决定如何处理这种不可关闭的资源。executeAndClose
它可以用/而不是如果需要一个/多个实际的例外来加强。Validation
ValidationNEL
Option