2009-07-28 3 views
4

Ich habe eine einfache benutzerdefinierte Ausnahme wie folgt definiert, aber ich mag nicht die Throw-Funktion verwenden und ich wirklich nicht gerne beide Throw und eine Throw2 Funktionen haben. Gibt es einen eleganteren Weg dies zu tun? Gibt es eine Möglichkeit, MyError oder Error direkt ohne die Zwischenfunktion zu werfen?F #: Benutzerdefinierte Ausnahmen. Gibt es eine bessere Möglichkeit, den Ausnahmetyp zu überlasten?

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

Ich verwende es wie folgt aus, aber ich möchte eine der Varianten verwenden, die nicht

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

Antwort

14

ignorieren Nur exception Konstrukt und definieren die Ausnahmeklasse nicht funktioniert - das ist , ein aus System.Exception Herleiten - direkt, wie in 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)) 

beachte, dass ich Msg Element entfernt, weil eine Exception equi hat valent Message Eigentum bereits.

+0

Ich wusste, dass es so einfach sein musste. Vielen Dank! – telesphore4

1

Ich weiß nicht genau, was Sie wollen, aber wie funktioniert das für Sie?

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 
+0

Ah ... die Sternennotation wird sich als nützlich erweisen. Ich mag auch die Verwendung der Reverse-Pipe. – telesphore4

1

Wie wäre es MyError als Datensatz neu zu definieren und mit Hilfe der Datensatz Syntax, um den Fehler zu erfassen, e.g.:-

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

exception Error of MyError 

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

OK, aber wie kompliziert wäre es, eine Variante zu haben, die nur die Nachricht hatte, oder das Code-Feld auf 0 voreinzustellen? – telesphore4

+0

Einfach eine Funktion definieren? – ljs

Verwandte Themen