我一直在學習F#,並且正在寫一個工具。一切正常,除非我需要處理無效輸入或異常情況。如何處理異常輸入並停止運行F#中的其餘功能?
在F#中處理這個問題的建議方法是什麼?我的函數被構造和使用的方式我不知道如何發回一條消息,告訴調用函數由於錯誤的輸入以及類似於C#的循環繼續需要發生調用失敗。
由於回報的損失,我很痛苦。我可以從F#函數的任何位置返回,還是必須在最後一行?
這是我的一些代碼的例子,其中輸入在某些情況下基本上是空的,我正在檢測它。我需要阻止運行過程中的步驟。
let SchemaQueryString s =
let sqsValid s =
let Strcat (x : string) (y : string) = x + ", " + y;
let RecFieldName (x : MeasurementRecord) = x.FieldName;
let mapr = List.map RecFieldName s.MeasurementTypes;
let cores = List.reduce Strcat mapr;
"SELECT ProductionCode, TestTime, " + cores + " FROM " + s.TemplateName + " ORDER BY ProductionCode, TestTime";
match s.MeasurementTypes.Length with
| 0 -> ""
| _ -> sqsValid s;
let TemplateMigration tcs rr =
let sql = SchemaQueryString tcs;
let sqlc = new SqlCommand(sql, QCOld);
let sqldr = sqlc.ExecuteReader();
ignore (sqldr.Read());
...
我需要中止TemplateMigration功能,並以「」上一場比賽的SQL變量的立即返回。或者構造某種類型的聯合類型,表示不能構造sql查詢字符串,因爲對於特定情況它不能完成。
感謝您的幫助。我逐漸想出了這種語言,我對它很喜歡,但是我正在努力解決它的某些方面,我不知道如何取代我的關於如何用功能性思想做某些事情的程序性思想。
所以,如果我有一個函數返回單位類型,我可以只是做 如果條件then()和函數將退出,如果條件滿足? – 2009-08-17 14:32:44
想想你的代碼將如何評估。函數式編程增加了一些有趣的怪癖,但大部分行都是按順序執行的。控制語句(如IF和RETURN)會中斷正常流程。將剩餘的代碼放入ELSE中,然後代碼塊將無所事事,但返回NULL,這是一個特殊值,其他函數可以將其解釋爲無效數據。 – mcandre 2009-08-17 14:43:00
不,你不能只是做「如果條件then()」,因爲那樣會完全評估一個單位,如果它不是最後一個表達式,就會被忽略。你需要一個其他的東西,這個東西到達其他的功能。例如** let test x = if String.IsNullOrEmpty x then(); printfn「有價值」; printfn「最後一點工作」;; **如果用其他替換,則會看到最終打印兩行,而不管輸入如何。 – MichaelGG 2009-08-18 01:21:50