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 就能獲取到表達式的錯誤信息,小伙伴們還記得前面介紹的 當使用加號 + 將文本與數字相加導致的報錯,這報錯信息就是開發者已經定義好的。
