簡體   English   中英

F#:自定義例外。 有沒有更好的方法來重載異常類型?

[英]F#: Custom exceptions. Is there a better way to overload the exception type?

我有一個簡單的自定義異常,如下所示,但我不喜歡使用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)

我正在使用它,如下所示,但我想使用其中一個不起作用的變體

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)))

只需忽略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))

請注意,我刪除了Msg成員,因為Exception已經具有等效的Message屬性。

我不清楚你究竟是在追求什么,但這對你有什么用?

exception Error of int * string
let ErrorC(s) = Error(0,s)

let F() =
    try
        let key = true
        raise <| Error(42, System.String.Format("Could not parse '{0}'", key))
        raise <| ErrorC(System.String.Format("Could not parse '{0}'", key))
    with Error(code, msg) ->
        printfn "%d: %s" code msg

如何將MyError重新定義為記錄並使用記錄語法記錄錯誤,例如: -

type MyError =
    { Msg:  string;
      Code: int } 

exception Error of MyError

raise <| Error { Msg  = ( sprintf "Could not parse boolean value '%b'" key );
                 Code = code }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM