簡體   English   中英

何時在F#中引發nullArg

[英]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.

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