全文轉載自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等屬性)進行賦值。
- a = [1,2,3];
- b = [2,3];
- try
- c = [a; b]; %有錯誤(列的維度不一致),跳轉到catch語句行並執行
- disp(c); %發現錯誤後,該行代碼不執行
- catch ErrorInfo %捕獲到的錯誤是一個MException對象
- disp(ErrorInfo);
- disp(ErrorInfo.identifier);
- disp(ErrorInfo.message);
- disp(ErrorInfo.stack);
- disp(ErrorInfo.cause);
- %發生錯誤時的其他動作
- end
形式2
直接生成一個MException對象ME,並手動對ME對象中的屬性進行初始化賦值。
MException類對象的初始化格式爲:
MException(MSGID, ERRMSG, V1, V2, …, VN),其中MSGID爲identifier,ERRMSG爲message,其中ERRMSG可以爲包含%s、%d等格式控制字符串,而V1、V2…VN則爲格式控制串對應的值。
- inputstr = input(‘Type a variable name:’, ‘s’);
- if ~exist(inputstr, ‘var’)
- ME = MException(‘MyComponent:noSuchVariable’, ‘Variable %s not found’, inputstr);%直接生成一個MException對象,並初始化
- throw(ME);
- 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對象中,因此可以用該函數返回最新的一個未被捕獲的錯誤信息。