2009-12-16 17 views
12

MATLAB hata mesajlarını bir dosyaya kaydetmenin bir yolu var mı?Çıktı hata mesajlarını MATLAB içinde dosyaya kaydetme

Bu basit bir sorun olabilir, ancak Google bana bir yanıt veremedi. MATLAB lisansı olmadan kullanım için bir GUI yürütülebilir dosyası derledim ve bazen donuyor. Estetik amaçlı olarak, normalde böyle bir yürütülebilirliğe eşlik eden komut penceresini bastım, bu yüzden komut isteminde bir hata mesajı alamıyorum. Hata ayıklama için bana e-postayla gönderilebilecek bir hata günlüğü oluşturmak istiyorum.

Teşekkürler!

cevap

11

Günlük dosyası oluşturmak için "günlük" komutunu kullanın. Bu, Matlab'ın tüm komut satırı çıktısının bir kopyasını uyarılara, hata mesajlarına ve işlenmeyen istisnalar için yığın izlerini içeren bir dosyaya yazmasını sağlar. Sendmail() daha sonra size hatalarla gönderebilir. Eğer yerden tasarruf etmek isterseniz, programın log dosyasını normal (hata yok) program çıkışında silebilirsiniz.

IMHO bu kullanmaktan daha iyidir "yakalamak ... deneyin; hataları yazma; sonu" Çünkü:

  • Tüm yakalanmamış hataları yakalayacaktır, M Java AWT iplikten kaldırdı istisnalar ve hatalar dahil GUI'nizde kodlama geri çağırma, hangi denemek/yakalamak için zor olabilir.
  • Matlab, bir segfault gibi sert bir şekilde çöküyorsa, M kodu düzeyinde try/catch bunu yakalamaz. Ancak günlük dosyası hala segfault dökümü kaydedebilir.
  • Programınızın hatalara neden olan davranışları hakkında daha fazla bilgi vermek için ilerleme iletileri, hata ayıklama bilgisi ve uyarılar yayabilir ve bunların tümü yakalanır.
  • Kodu en az yakalama bloklarında tutmaktan hoşlanırım.

Eşdeğer bir komut satırı seçeneği de var; Derlenmiş Matlab için bunu nasıl başaracağımı bilmiyorum. Kesin biçimlendirme stil için

+0

Teşekkürler, eğer vaktim varsa bunu da deneyeceğim. Zaten Jonas'ın kod çalışmasının uyarlanmış bir versiyonunu aldım. – Doresoom

+0

Kendi log dosyamdan (sınıflarımın tümü 'log' adı verilen bir yöntemle geliyor) kişisel olarak destekliyorum çünkü komut penceresini tüm hata ayıklama bilgilerimle karıştırmak istemiyorum. Ancak, sert çökmeler ve java istisnaları için, günlük kesinlikle çok yararlıdır. – Jonas

11

Kodun etrafındaki ... try ifadelerini kullanın. Yakalama bloğunda, yığın bilgileri dahil olmak üzere hatayı yazabilirsiniz. Sendmail'in kullanarak, hatta koduna sahip olabilir biraz daha açık olmak

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 

Düzenlendi (ideal kullanıcıların sizinle kazasında bilgileri paylaşmak isteyip istemediğinize karar sağlayan bir pop-up ile) posta yoluyla hataları size bildirir hata iletisi nasıl yazılır

+6

. MEXception.getReport() yöntemi sizin için yapacak: fprintf (fid, '% s', err.getReport ('genişletilmiş', 'köprüler', 'kapalı')) –

+0

Herhangi bir başkasının başvurusu için sendmail (Burada Gmail için kod: http://www.mathworks.com/support/solutions/en/data/1-3PRRDV/index.html – Doresoom

+0

Öneriniz için teşekkürler Andrew ve gnovice. – Jonas

3

MATLAB'in daha eski sürümleri için MATLAB tarafından yayınlanan en son hata hakkında bilgi almak için LASTERROR işlevini kullanabilirsiniz. Ancak, bu işlev daha yeni MATLAB sürümlerinde aşamalı olarak kaldırılacaktır.

MATLAB'ın daha yeni sürümleri için, MException class ürününü capture error information'dan kullanmanızı öneririm. (Eğer kod çalıştırmasına nasıl bağlı olarak) Bir try-catch blockJonas suggested olarak kullanan bir MException nesneyi yakalamak ya da potansiyel olarak son yakalanmamış istisna almak için statik MException.last method kullanabilirsiniz: Eğer MException nesneyi yakalamak için hangi yol kullanılırsa

%# 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 

, sen MException nesnesinde bulunan bilgileri de içeren biçimlendirilmiş bir ileti dize görüntülemek için MException.getReport method kullanabilirsiniz:

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

Daha sonra bir dosyaya mesaj dize yazabilir.

1

gibi Matlab komut penceresinden, kullanın: Mesajı biçimlendirmek ve kendinizi iz yığını gerekmez

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