F#异常处理结构

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#团队没有真的需要担心这个.


Bri*_*ian 7

正交?你可以简单地在try-finally中嵌套try-with,如你所示.(无论如何,这是在IL级别发生的事情,我想.)

也就是说,try-with-finally是我们在未来版本的语言中可以考虑的事情.

就个人而言,我只想要它几次,但是当你确实需要它时,必须做额外的嵌套/缩进有点麻烦.一般来说,我发现我很少编写异常处理代码,它通常只是一个或另一个(例如最终恢复不变或其他事务语义,或者在应用程序顶部附近的'catch'来记录异常或显示用户诊断).

但我认为这里的语言设计并没有太大的内容.