代码之家  ›  专栏  ›  技术社区  ›  em70

f部分函数的异常处理

  •  3
  • em70  · 技术社区  · 14 年前

    我正在尝试编写一个函数,其中只有两个方法调用(方法为Unit->Unit)应该处理某个异常。行为应为:
    -如果引发异常,则整个函数结束
    -函数(异常处理程序外部)否则继续运行

    起初,我认为我可以使用一个函数,其中的语句被一个try/with块和一个continue所包围,但当然,continue将从块中调用……我可能会将语句包装在一个函数中,并使用一个返回值来表示成功/失败,但是与下面的C代码相比,这对我来说似乎很笨拙,这正是我在F中努力实现的目标。

    SomeType MyMethod(string x)
    {
        ...
        try
        {
            foo();
            bar();
        }
        catch(SomeException)
        {
            return null;
        }
        ...
        return ...;
    }
    
    4 回复  |  直到 14 年前
        1
  •  4
  •   desco    14 年前

    像这样?

    // f <- foo(); bar(); etc...
    // k <- unprotected continuation
    let runProtected f k = 
        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
    
        2
  •  2
  •   elmattic    14 年前

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

    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
    
        3
  •  0
  •   Tim Robinson    14 年前

    怎么样:

    let success =
        try
            foo ()
            bar ()
            true
        with :? SomeException ->
            false
    
    if success then
        ...
    else
        ()
    
        4
  •  0
  •   James Hugard    14 年前

    好。。。你 能够 做…

    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"
    

    强烈建议从返回空值切换到返回选项类型(一些(x)/无)。让编译器捕获未处理空值的位置,而不是您的用户;-)