F#:自定义例外.有没有更好的方法来重载异常类型?

tel*_*re4 6 f# exception

我有一个简单的自定义异常,如下所示,但我不喜欢使用Throw函数,我真的不喜欢同时使用Throw和Throw2函数.有更优雅的方式吗?有没有一种方法可以在没有中间函数的情况下直接抛出MyError或Error?

#light

module Utilities.MyException

type MyError(code : int, msg : string) =
    member e.Msg  = msg
    member e.Code = code
    new (msg : string) = MyError(0, msg)

exception Error of MyError

let public Throw (msg : string) =
    let err = new MyError(msg)
    raise (Error err)

let public Throw2 (code : int) (msg : string) =
    let err = new MyError(code, msg)
    raise (Error err)
Run Code Online (Sandbox Code Playgroud)

我正在使用它,如下所示,但我想使用其中一个不起作用的变体

Throw(System.String.Format("Could not parse boolean value '{0}'", key))

//The string isn't of the correct type for Error
//raise(Error(System.String.Format("Could not parse boolean value '{0}'", key)))

//MyError isn't compatible with System.Exception
//raise(MyError(System.String.Format("Could not parse boolean value '{0}'", key)))
Run Code Online (Sandbox Code Playgroud)

Pav*_*aev 16

只需忽略exception构造并定义异常类 - 即System.Exception直接派生自- ,如在C#中:

type MyError(code : int, msg : string) =
    inherit Exception(msg)
    member e.Code = code
    new (msg : string) = MyError(0, msg)

raise(MyError("Foo"))
raise(MyError("Foo", 1))
Run Code Online (Sandbox Code Playgroud)

请注意,我删除了Msg成员,因为Exception已经有一个等效的Message属性.