有沒有辦法將MATLAB錯誤信息保存到文件中?將輸出錯誤信息保存到MATLAB文件中
這可能是一個簡單的問題,但谷歌無法給我一個答案。我編譯了一個沒有MATLAB許可證的GUI可執行文件,偶爾它會凍結。出於美學目的,我壓制了通常伴隨此類可執行文件的命令窗口,因此我無法通過命令提示符獲取錯誤消息。我希望能夠創建一個錯誤日誌,可以通過電子郵件發送給我進行調試。
謝謝!
有沒有辦法將MATLAB錯誤信息保存到文件中?將輸出錯誤信息保存到MATLAB文件中
這可能是一個簡單的問題,但谷歌無法給我一個答案。我編譯了一個沒有MATLAB許可證的GUI可執行文件,偶爾它會凍結。出於美學目的,我壓制了通常伴隨此類可執行文件的命令窗口,因此我無法通過命令提示符獲取錯誤消息。我希望能夠創建一個錯誤日誌,可以通過電子郵件發送給我進行調試。
謝謝!
使用「diary」命令創建日誌文件。這將使Matlab將所有命令行輸出的副本寫入文件,包括警告,錯誤消息和未處理異常的堆棧跟蹤。然後,Sendmail()可以將錯誤發送給您。如果您想節省空間,您可以讓程序在正常(無錯誤)程序退出時刪除其日誌文件。
恕我直言,這是最好使用「的try ... catch;寫入錯誤,結束」,因爲:
還有一個命令行選項可以實現等效功能;我不知道如何爲編譯的Matlab調用它。
圍繞代碼使用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
編輯成更明確一點如何將錯誤信息寫入文件
你不需要格式化消息和堆棧跟蹤自己。 MException.getReport()方法會爲你做:fprintf(fid,'%s',err.getReport('extended','hyperlinks','off')) – 2009-12-17 19:57:17
對於其他人的引用,我發現sendmail )代碼爲: http://www.mathworks.com/support/solutions/en/data/1-3PRRDV/index.html – Doresoom 2009-12-17 21:38:37
感謝您的建議,安德魯和gnovice。 – Jonas 2009-12-19 17:35:42
對於舊版本的MATLAB,您可以使用LASTERROR函數來獲取有關MATLAB發佈的最新錯誤的信息。但是,這個函數將在更新的MATLAB版本中被淘汰。
對於較新版本的MATLAB,我建議使用MException class至capture 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
然後,您可以編寫消息字符串的文件。
對於準確的格式風格就像從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');
try
% your code here
catch err
fid = fopen('errorFile','a+');
fprintf(fid, '%s', err.getReport('extended', 'hyperlinks','off'))
fclose(fid)
end
謝謝,如果我有時間的話,我也會試一試。我已經有了一個喬納斯的代碼工作的改編版本。 – Doresoom 2009-12-17 21:41:21
我個人更喜歡使用我自己的日誌文件(我的類都帶有一個名爲'log'的方法),因爲我不想把命令窗口與我所有的調試信息混淆在一起。但是,對於嚴重崩潰和Java異常,日記當然非常有用。 – Jonas 2009-12-19 17:44:29