2013-06-05 19 views
5

Şu anda iç içe tutulmuş try-catch deyimleriyle kod hata ayıklama yapıyorum.Yuvalanmış try-catch deyiminden kaçış

Hataları dbstop komutuyla kolayca halledebilirim, ancak her kodlamada ve programın çalışmasını durdurmak istediğimde, her bir yuvalama seviyesi için bir kez dbquit girmem gerekiyor.

Bu oldukça sinir bozucu olduğundan, hata ayıklama işlemini tamamladığımda tüm programların hata ayıklamasını gerçekten durduracak bir çözüm arıyorum. İşte

ben kod çağırmak nasıl bir örnektir:

dbstop if error 
dbstop if caught error 
mytestmain 

Ve burada fonksiyonu (subfunction veya farklı bir .m dosyasında olabilir veya olmayabilir)

nasıl görüneceği ile bir örnektir
function mytestmain 
try 
    mytestsub 
catch 
end 

%% Definition of subfunction 
function mytestsub 
try 
    a=b;%generate an error as b is not defined 
catch 
end 

ne denediniz mi?

  • Ancak bu sadece bir kere dbquit çalıştırır, bir komut dosyası veya iki kez dbquit çağıran bir fonksiyonu kullanılarak çalıştı.
  • Ben dbquit('all') kullanarak çalıştı, ancak hiçbir etkisi ben kodunda try-catch ifadeleri kaldırmak için tercih

Not ile.

+0

Bu davranış şaşırtıcıdır; 'dbquit', try/catches 'inizin ne kadar derinlemesine barındırıldığına bakılmaksızın, hata ayıklayıcısından ve kod yürütme işleminden tamamen kurtulmalı. Sık sık derinlemesine iç içe deneyler/yakalamalar ile yaparım. Matlab'ın hangi sürümünü kullanıyorsunuz? –

cevap

2

Sen ek olarak kesme noktaları kullanıyorsanız bu da açık tüm kırılma noktaları size, dolayısıyla elle ayarlamak, yerine kullanmalısınız edeceğini, ancak, dbquit

dbclear all; dbquit; 

Not kullanmadan önce dbclear diyebiliriz

dbclear if error; dbclear if caught error; dbquit; 
+1

Ayrıca, * kesme noktaları kullanırsanız daha can sıkıcı olabilir ... artı, 'yakalandı hata durumunda dbstop' yazmanız gerekir; her zaman hata dbstop ... –

+0

@RodyOldenhuis Evet, haklısınız; bunu söylediğin için teşekkürler. Lütfen güncellenmiş yanıtıma bakın. –

+0

Aslında, dbclear if error; yakalanırsa dbclear; dbquit; 've ikinci bir hata ile yakalanırsa dbstop; hata varsa dbstop;' Sonra sadece iki tıklama. –

1

Bu şekilde çalışması gereken bir şey değil. Tek bir dbquit, try/catch ifadelerinizin ne kadar derinlemesine iç içe geçtiğine ve hangi kesme noktalarının hala ayarlandığına bakılmaksızın sizi hata ayıklayıcısından tamamen çıkarmalıdır.

Eski bir Matlab sürümünü mi çalıştırıyorsunuz? Matlab'ın R2009b sürümlerinde, bu davranışa neden olabileceğine benzeyen bir known bug related to dbstop if caught error var. Daha eski bir sürümdeyseniz yükseltebilirsiniz.

Sürümünüzden bağımsız olarak, dbstop if error ve dbstop if caught error ifadeleri yerine dbstop if all error yapmayı deneyin ve davranış değişip değişmediğini öğrenin.

Ayrıca, "K >>" komut isteminden ve iç içe geçmiş hata ayıklayıcı oturumları ile biten çok sayıda işlev çalıştırıyor olabileceğinizi tahmin edebilirdim, ancak yaptığınız dbquit('all') bu durumu dikkate almalıydı.

+0

Kullandığım sürüm oldukça yeni ve bunu düşünmüyorum sorun. Benim tahminim de aslında iç içe geçmiş oturumlar gibi bir şey, ya da ilk önce bir hata yakaladım (hata yakalanırsa dbstop tarafından yakalanır) ve daha sonra 'dbquit 'kullanarak bir hata yaratır ve sonra' dbstop if error 'durumunda tetiklenir. Şansını bulduğumda çözümünü deneyeceğim. –