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 就能获取到表达式的错误信息,小伙伴们还记得前面介绍的 当使用加号 + 将文本与数字相加导致的报错,这报错信息就是开发者已经定义好的。