2009-12-16 79 views
12

有沒有辦法將MATLAB錯誤信息保存到文件中?將輸出錯誤信息保存到MATLAB文件中

這可能是一個簡單的問題,但谷歌無法給我一個答案。我編譯了一個沒有MATLAB許可證的GUI可執行文件,偶爾它會凍結。出於美學目的,我壓制了通常伴隨此類可執行文件的命令窗口,因此我無法通過命令提示符獲取錯誤消息。我希望能夠創建一個錯誤日誌,可以通過電子郵件發送給我進行調試。

謝謝!

回答

11

使用「diary」命令創建日誌文件。這將使Matlab將所有命令行輸出的副本寫入文件,包括警告,錯誤消息和未處理異常的堆棧跟蹤。然後,Sendmail()可以將錯誤發送給您。如果您想節省空間,您可以讓程序在正常(無錯誤)程序退出時刪除其日誌文件。

恕我直言,這是最好使用「的try ... catch;寫入錯誤,結束」,因爲:

  • 它將捕獲所有未被捕獲的錯誤,包括來自AWT線程提出的Java異常和錯誤的M在你的圖形用戶界面的代碼回調,這可能很難得到周圍的嘗試/捕獲。
  • 如果Matlab崩潰很嚴重,就像使用段錯誤一樣,M代碼級try/catch將無法捕捉它。但日記文件可能仍會記錄段故障轉儲。
  • 您可以發出進度消息,調試信息和警告,以提供有關導致錯誤的程序行爲的更多信息,並且全部都會被捕獲。
  • 我喜歡儘量減少catch塊的代碼。

還有一個命令行選項可以實現等效功能;我不知道如何爲編譯的Matlab調用它。

+0

謝謝,如果我有時間的話,我也會試一試。我已經有了一個喬納斯的代碼工作的改編版本。 – Doresoom 2009-12-17 21:41:21

+0

我個人更喜歡使用我自己的日誌文件(我的類都帶有一個名爲'log'的方法),因爲我不想把命令窗口與我所有的調試信息混淆在一起。但是,對於嚴重崩潰和Java異常,日記當然非常有用。 – Jonas 2009-12-19 17:44:29

11

圍繞代碼使用try ... catch語句。在catch塊中,你可以寫出錯誤信息,包括堆棧信息。使用sendmail,你甚至可以有代碼通過郵件通知你錯誤的(最好有一個彈出窗口,讓用戶決定是否要與大家分享的崩潰信息)

try 
    % your code here 
catch err 
    %open file 
    fid = fopen('logFile','a+'); 
    % write the error to file 
    % first line: message 
    fprintf(fid,'%s\n',err.message); 

    % following lines: stack 
    for e=1:length(err.stack) 
     fprintf(fid,'%sin %s at %i\n',txt,err.stack(e).name,err.stack(e).line); 
    end 

    % close file 
    fclose(fid) 
end 

編輯成更明確一點如何將錯誤信息寫入文件

+6

你不需要格式化消息和堆棧跟蹤自己。 MException.getReport()方法會爲你做:fprintf(fid,'%s',err.getReport('extended','hyperlinks','off')) – 2009-12-17 19:57:17

+0

對於其他人的引用,我發現sendmail )代碼爲: http://www.mathworks.com/support/solutions/en/data/1-3PRRDV/index.html – Doresoom 2009-12-17 21:38:37

+0

感謝您的建議,安德魯和gnovice。 – Jonas 2009-12-19 17:35:42

3

對於舊版本的MATLAB,您可以使用LASTERROR函數來獲取有關MATLAB發佈的最新錯誤的信息。但是,這個函數將在更新的MATLAB版本中被淘汰。

對於較新版本的MATLAB,我建議使用MException classcapture error information。您可以使用try-catch block作爲Jonas suggested趕上一個MException對象,或者你可能使用靜態MException.last method得到最後的未捕獲異常(取決於你如何運行代碼):

%# OPTION 1: 
%# -------- 
try 
    my_code(); 
catch ME 
    %# Save data in ME to file 
end 
%# OPTION 2: 
%# -------- 
my_code(); 
ME = MException.last; 
%# Save data in ME to file 

您捕捉MException對象無論怎樣,你可以使用MException.getReport method顯示格式化的消息字符串包括包含在MException對象的信息:

msgString = getReport(ME,'basic');  %# Displays the higher level error 
msgString = getReport(ME,'extended'); %# Displays the error and the stack 

然後,您可以編寫消息字符串的文件。

1

對於準確的格式風格就像從MATLAB命令窗口中,使用:

rep = getReport(exception, 'extended', 'hyperlinks', 'off'); 

name = strcat('Data\', name, '.txt'); 
fid = fopen(name, 'w+t','n'); 
fprintf(fid, 'Error message\n-------------\n\n'); 
fprintf(fid, '%s\n', rep); 
fclose('all'); 
2
try 
    % your code here 
catch err 
    fid = fopen('errorFile','a+'); 
    fprintf(fid, '%s', err.getReport('extended', 'hyperlinks','off')) 
    fclose(fid) 
end