1、定義並拋出異常
2、 獲取處理異常。
在M語言中也有類似的機制,接下來我們詳細介紹。
M語言的異常及異常標記
M語言中的異常有哪些?常見的異常主要有以下幾個方面:
1、函數使用了錯誤的參數產生的錯誤
比如 Number.ToText(number) 只能處理數字類型的參數,當參數為其他類型的時候程序會直接報錯。
let result = Number.ToText("1") in result
比如加號+只能用於數字或時間類型的數據相加,但是當加號兩邊出現了其他類型的數據的時候程序也會報錯
let result = 1+"1" in result
錯誤信息如何定義呢?其實很簡單,使用關鍵字 error + 錯誤信息就可以了
舉個小例子:
let a = -1,//定義變量a 假如a初始值為-1,這樣就可以拋出異常了 result = if a>0 then a else error "not positive"//這是一個if表達式,當a>0 返回 a的值否則拋出錯誤 in result
M語言種獲取異常的方法
我們想要查看一個表達式是否會拋出異常需要用到try 關鍵字。用法如下:
try 待測試的表達式
[ HasError = true, Error = [ Reason = "Expression.Error", Message = "錯誤信息", //此處的錯誤信息即為 error關鍵字后面所跟的字符串 Detail = null ] ]
[ HasError = FALSE, Value = 待測試的表達式正確的結果 ]
我們可以將表達式的值賦給一個變量
result = try 待測試的表達式
然后可以通過對result這個記錄 進行索引來獲取表達式是否錯誤以及錯誤信息或者最后的value。
result[HasError]//判斷該值為TRUE 還是 FALSE 當result[HasError] 為 TRUE 的時候說明有異常拋出,可以使用 result[Error][Message]來獲取錯誤信息 當result[HasError] 為 FALSE 的時候說明沒有異常拋出,可以使用 result[Value]獲取表達式的結果
一個小例子:
let Sales = [ ProductName = "Fishing rod", //產品名稱 Revenue = 2000, // 收入 Units = 1000, //數量 UnitPrice = if Units = 0 then error "No Units" else Revenue / Units //當Units為0的時候拋出異常否則返回均價 ], textUnitPrice = try Number.ToText(Sales[UnitPrice]), //將均價由數字類型准換為文本類型 Label = "Unit Price: " & (if textUnitPrice[HasError] then textUnitPrice[Error][Message] else textUnitPrice[Value]) in Label
"Unit Price: 2"
"Unit Price: No Units"
常見的情況是用默認值替換錯誤。try表達式可以與一個可選的otherwise子句一起使用,以更緊湊、簡單的形式實現上述過程:
let Sales = [ ProductName = "Fishing rod", Revenue = 2000, Units = 1000, UnitPrice = if Units = 0 then error "No Units" else Revenue / Units ], textUnitPrice = try Number.ToText(Sales[UnitPrice]) otherwise "No Units", Label = "Unit Price: " & textUnitPrice in Label
需要注意的是M語言中的許多函數、操作符在微軟開發的時候就已經定義好了error信息,我們在使用的時候直接使用try 就能獲取到表達式的錯誤信息,小伙伴們還記得前面介紹的 當使用加號 + 將文本與數字相加導致的報錯,這報錯信息就是開發者已經定義好的。