Bru*_*eis 9 f# exception-handling exception
为什么F#自然不支持try/with/finally块?
尝试一些事情是不是有意义,处理它抛出的任何异常,至少记录异常,然后确保一些代码执行完毕后呢?
当然,我们可以做到
try
try
...
with ex -> ...
finally
...
Run Code Online (Sandbox Code Playgroud)
但这似乎过于人为,它清楚地表明"F#反对try/with/finally".这是为什么?
Tom*_*cek 13
正如有人已经提到的那样,您通常会使用try-with-finally以确保在发生异常时正确释放所有资源.我认为在大多数情况下,您可以使用use关键字更轻松地执行此操作:
let input =
try
use stream = new FileStream("C:\temp\test.txt");
use rdr = new StreamReader(stream);
Some(rdr.ReadToEnd())
with :? IOException as e ->
logError(e)
None
Run Code Online (Sandbox Code Playgroud)
我认为这主要是你不需要try-with-finally像其他语言那样经常使用的原因.但是当然,在某些情况下你可能需要它(但你当然可以通过创建IDisposable使用对象表达式的实例来避免这种情况(这在语法上非常简单).但我认为这是非常罕见的F#团队没有真的需要担心这个.
正交?你可以简单地在try-finally中嵌套try-with,如你所示.(无论如何,这是在IL级别发生的事情,我想.)
也就是说,try-with-finally是我们在未来版本的语言中可以考虑的事情.
就个人而言,我只想要它几次,但是当你确实需要它时,必须做额外的嵌套/缩进有点麻烦.一般来说,我发现我很少编写异常处理代码,它通常只是一个或另一个(例如最终恢复不变或其他事务语义,或者在应用程序顶部附近的'catch'来记录异常或显示用户诊断).
但我认为这里的语言设计并没有太大的内容.