我习惯在C#中编写这样的代码:
SomeObj obj; try{ // this may throw SomeException obj = GetSomeObj(); }catch(SomeException){ // Log error... obj = GetSomeDefaultValue(); } obj.DoSomething();@H_502_4@这是我在F#中翻译的方式(obj是一个列表):
let mutable obj = [] try obj <- getSomeObj with | ex -> // Log ex obj <- getSomeDefaultValue doSomething obj@H_502_4@在F#中没有使用可变变量有什么办法吗?在F#中是否有更优雅的方式来处理这种情况? @H_502_4@谢谢!
解决方法
F#-ish方式是在两个分支中返回相同类型的表达式:
let obj = try getSomeObj() with | ex -> // Log ex getSomeDefaultValue() doSomething obj@H_502_4@在F#中,可以使用选项类型来处理异常.当没有明显的默认值时,这是一个优点,编译器会强制您处理异常情况.
let objOpt = try Some(getSomeObj()) with | ex -> // Log ex None match objOpt with | Some obj -> doSomething obj | None -> (* Do something else *)