Matlab探尋(四):捕獲異常(catch MException)

     全文轉載自bible_reader博客 【Matlab捕獲異常】

  在寫Matlab小程序的時候,經常會遇到一些細小的錯誤或異常。在運行程序時,希望能夠捕獲這些錯誤並將其錯誤信息輸出,然後再寫發生錯誤時對應的處理程序。在此總結一下Matlab的錯誤捕捉並選擇性地輸出錯誤信息。

1、MException 捕獲異常信息類

Matlab提供了一個MException類來保存執行代碼時捕獲到的錯誤信息。當發現錯誤時,Matlab即生成一個MException類對象,該對象具有以下屬性和函數。

屬性:

    identifier:爲一個字符串,每一個錯誤對應一個identifier,其至少包含兩個用分號“:”隔開的子串,主要形式爲COMPONENT:MNEMONIC。

    message:爲一個字符串,主要用於向用戶反饋錯誤信息。

    stack:用於保存各個m文件之間調用的棧關係

    cause:造成錯誤的MExceptions所組成的元包陣列Cell Array。

函數:

    throw():將錯誤信息在命令窗口command window上輸出,並終止程序的執行。

    rethrow():將已經捕獲的錯誤重新在命令窗口command window上輸出,並終止程序的執行。

    throwAsCaller():用調用函數的方式將錯誤信息在命令窗口command window上輸出。

    addCause():將兩個MException錯誤信息進行疊加,並返回一個新的MException對象,該對象包含了被疊加的兩個MException對象的錯誤信息。

    getReport():獲取錯誤信息的message屬性並返回。

    last():返回最新的一個未被捕獲的錯誤信息。

2、捕獲異常的基本形式

形式1

將捕獲的錯誤直接傳遞到一個MException對象ErrorInfo,讓Matlab對ErrorInfo對象的屬性(identifier、message等屬性)進行賦值。

  1. a = [1,2,3];  
  2. b = [2,3];  
  3. try   
  4.     c = [a; b]; %有錯誤(列的維度不一致),跳轉到catch語句行並執行  
  5.     disp(c);    %發現錯誤後,該行代碼不執行  
  6. catch ErrorInfo %捕獲到的錯誤是一個MException對象  
  7.     disp(ErrorInfo);  
  8.     disp(ErrorInfo.identifier);  
  9.     disp(ErrorInfo.message);  
  10.     disp(ErrorInfo.stack);  
  11.     disp(ErrorInfo.cause);  
  12.       
  13.     %發生錯誤時的其他動作  
  14.   
  15. end  

形式2

直接生成一個MException對象ME,並手動對ME對象中的屬性進行初始化賦值。

MException類對象的初始化格式爲:

MException(MSGID, ERRMSG, V1, V2, …, VN),其中MSGID爲identifier,ERRMSG爲message,其中ERRMSG可以爲包含%s、%d等格式控制字符串,而V1、V2…VN則爲格式控制串對應的值。

  1. inputstr = input(‘Type a variable name:’, ‘s’);  
  2. if ~exist(inputstr, ‘var’)  
  3.    ME = MException(‘MyComponent:noSuchVariable’, ‘Variable %s not found’, inputstr);%直接生成一個MException對象,並初始化  
  4.    throw(ME);  
  5. end  

3、函數介紹

3.1 throw()

將錯誤信息在命令窗口command window上輸出,並終止程序的執行。其在命令窗口輸出的是錯誤對象的message屬性。


3.2 rethrow()

已經捕獲的錯誤重新在命令窗口command window上輸出,並終止程序的執行。利用該函數可以將上面的ErrorInfo重新拋出一次。注意兩者的細微區別。


3.3 throwAsCaller()

用調用函數的方式將錯誤信息在命令窗口command window上輸出。利用該函數採用調用函數的形式將錯誤信息在命令窗口command window上輸出。


3.4 addCause()

將兩個MException錯誤信息進行疊加,並返回一個新的MException對象,該對象包含了被疊加的兩個MException對象的錯誤信息。

如下所示,cause1_ME表示矩陣越界訪問錯誤,cause2_ME表示不存在這樣的文件時仍然load的錯誤。然後通過將這兩種錯誤信息進行疊加,具體效果如下圖所示。



3.5 getReport()

獲取錯誤信息的message屬性並返回。


3.6 last()

返回最新的一個未被捕獲的錯誤信息。如下所示,ErrorInfo是之前捕獲的錯誤信息,然後重新制造一個matlab錯誤(越界訪問矩陣),並且該錯誤並沒有被matlab捕獲到一個MException對象中,因此可以用該函數返回最新的一個未被捕獲的錯誤信息。


發佈了29 篇原創文章 · 獲贊 59 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章