[英]When to raise a nullArg in F#
從Exceptions(拋出和捕獲的語法) ,它說F#中內置了四個有用的異常關鍵字, nullArg
拋出NullArgumentException
:
let f x =
if x then "ok"
else nullArg "paramName" "message"
如果我只為F#用法編寫模塊,何時應該引發NullArgumentException
?
即使你只為F#消費編寫代碼,我認為在F#代碼中使用異常也是完全有效的。
如果您有預期的錯誤,那么使用Result
類型可能會更好。 這包括讀取可能格式不正確的數據(因為它來自用戶)或驗證可能不正確的用戶輸入。
但是,我認為例外仍然有助於表明特殊情況。 特別是對於nullArg
,在你需要它的情況下並不多,因為F#主要消除null
值,但是當你將.NET類型作為參數時,你仍然可以得到一個。 如果你有一個函數采用IDictionary<string, string>
而你永遠不會期望它為null
,那么編寫它可能是有用的:
let lookupName (dict:IDictionary<string, string>) =
if dict = null then nullArg "dict" "lookupName expects a valid dictionary!"
if dict.ContainsKey "name" then dict.["name"] else "anonymous"
由於IDictionary
是.NET類型,因此F#不會確保它永遠不為null
並且明確處理該案例可能會為您提供更多有用的錯誤信息,以防您在代碼中意外出錯。
你不應該。 例外情況很糟糕。 避免他們。 只有在與外部代碼接口時才使用它們,這些代碼要求您拋出異常或者不提供另一種報告錯誤的方法。
相反,如果您正在編寫可能失敗的函數,請使其返回“或/或”值 - 結果或錯誤。 沿着這些方向:
type Result<'t, 'e> = Ok of 't | Error of 'e
let f x =
if x then Ok "ok"
else Error "boo!"
這樣,調用代碼不能“忘記”處理錯誤情況:編譯器不會讓它。 這是一件好事。
順便提一下, F#4.1在框中包含Result
類型 (以及一些有用的實用程序)。 查看該帖子中的示例。
同樣感興趣: 這里有一系列精彩的文章和關於這個主題的演示視頻。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.