F#异常处理的功能部分

我试图写一个函数,其中只有两个方法调用(用方法为单元 - >单位)应具有一定的例外处理。 的行为应该是:
- 如果有异常引发整个函数结束
- 函数的推移(异常处理程序外),否则

起初,我以为我可以使用与包装在try / with块和延续语句的功能,当然延续将从块中调用的......我大概可以换行语句中的功能和使用然而,返回值的信号成功/失败,比起下面的C#代码,它做什么,我想要实现在F#,看起来笨重给我。

SomeType MyMethod(string x) { ... try { foo(); bar(); } catch(SomeException) { return null; } ... return ...; }

--------------解决方案-------------

像这样的事情?

// f <- foo(); bar(); etc...
// k <- unprotected continuation
let runProtected fk =
if try f(); true with _ -> false
then k()
else null

// sample from the question
let runProtected () =
if try
foo(); bar();
true
with _ ->
false
then unprotected()
else null

我认为最好的惯用代码使用的选项类型:

member t.MyMethod(x : string) : SomeType =
let result =
try
foo()
bar()
Some(...)
with :? SomeException ->
None

match(result)
| Some(...) -> // do other work and return something
| None -> // return something

怎么样:

let success =
try
foo ()
bar ()
true
with :? SomeException ->
false

if success then
...
else
()

嗯... 可以做...

type Test() =
member this.MyMethod (x:string) =
if try
foo()
bar()
true
with _ -> false
then
// do more work
"blah"
else
null

或者,翻转真/假...

type Test() =
member this.MyMethod (x:string) =
if try
foo();
bar();
false
with _ -> true
then
// bail early
null
else
// do more work
"blah"

强烈建议从返回null久违的选项类型(某些(X)/​​无)转换,虽然。 让空在那里没有处理,而不是你的用户编译器抓地;-)

分类:例外 时间:2015-03-15 人气:0
本文关键词: 异常,异常处理,F#
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.621 (s). 10 q(s)