power query M語言中的異常處理


       異常是由程序在運行過程中出現的各種無法預知的錯誤導致的、當這種錯誤發生后程序的執行會中斷在異常位置而不會繼續執行后面的代碼。一段好的代碼可以從容應對任何異常的情況,保證程序能平穩運行而不崩潰,這就是常說的代碼健壯性。想要處理程序運行中的異常除了需要盡可能的預判到所有會出現的情況之外還需有好的機制來處理無法預判的狀況。編程語言中一般都會提供一種異常處理機制:

       1、定義並拋出異常

       2、 獲取處理異常。

在M語言中也有類似的機制,接下來我們詳細介紹。

M語言的異常及異常標記

M語言中的異常有哪些?常見的異常主要有以下幾個方面:

1、函數使用了錯誤的參數產生的錯誤

          比如   Number.ToText(number) 只能處理數字類型的參數,當參數為其他類型的時候程序會直接報錯。

let
    result = Number.ToText("1")
in
    result

  

2、操作符操作了不恰當的數據:

            比如加號+只能用於數字或時間類型的數據相加,但是當加號兩邊出現了其他類型的數據的時候程序也會報錯

let
    result = 1+"1"
in
    result

  

這些黃色區域的錯誤信息都是由PowerBI提前定義好的,當錯誤發生后就會直接拋出來展示給我們。

錯誤信息如何定義呢?其實很簡單,使用關鍵字 error + 錯誤信息就可以了

舉個小例子:

let
    a = -1,//定義變量a 假如a初始值為-1,這樣就可以拋出異常了
    result = if a>0 then a else error "not positive"//這是一個if表達式,當a>0 返回 a的值否則拋出錯誤
in
    result

  

通過執行結果,我們可以看出系統已經獲取到錯誤信息。但這不是我們想要的,這種情況下代碼已經從錯誤的位置處停止了,也許后續還有很多數據需要處理的數據。因此我們需要讓我們寫的程序獲取錯誤,而不是由系統獲取。接下來我們介紹M語言獲取錯誤的方式方法。

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  

  上面的示例訪問該Sales[UnitPrice]字段並格式化生成結果的值:

"Unit Price: 2"  

  如果Units字段為0,則該UnitPrice字段會拋出一個異常Error,該錯誤將由try獲取處理。結果值將是:

"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   

  

這樣也可以得到最終的結果而無需去訪問並索引 try 的返回值。

需要注意的是M語言中的許多函數、操作符在微軟開發的時候就已經定義好了error信息,我們在使用的時候直接使用try 就能獲取到表達式的錯誤信息,小伙伴們還記得前面介紹的 當使用加號 + 將文本與數字相加導致的報錯,這報錯信息就是開發者已經定義好的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM