2013-06-05 9 views
5

Aktualnie debuguję kod za pomocą zagnieżdżonych instrukcji catch-try.Escape from nested try - catch statement

Z łatwością mogę poradzić sobie z błędami za pomocą polecenia dbstop, ale za każdym razem, gdy patrzę na kod i chcę przestać go uruchamiać, muszę raz wprowadzić dbquit dla każdego poziomu zagnieżdżenia.

Ponieważ jest to dość irytujące, szukam rozwiązania, które naprawdę przestanie debugować wszystkie programy po zakończeniu debugowania.

Oto przykład, jak nazywam Kod:

dbstop if error 
dbstop if caught error 
mytestmain 

I tu jest przykładem tego, co funkcja może wyglądać (podfunkcję mogą lub nie mogą być w innym pliku .m)

function mytestmain 
try 
    mytestsub 
catch 
end 

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

Czego próbowałem?

  • Próbowałem za pomocą skryptu lub funkcji, która wywołuje dbquit dwukrotnie, jednak będzie to tylko wykonać dbquit raz.
  • Próbowałem za pomocą dbquit('all'), ale bez efektu

pamiętać, że nie wolą usunąć sprawozdania try-catch w kodzie.

+0

To zachowanie jest zaskakujące; 'dbquit' powinno ci wydostać się z debuggera i wykonać kod, niezależnie od tego, jak głęboko zagnieżdżone są twoje try/catch. Robię to często z głęboko zagnieżdżonymi try/catch. W jakiej wersji Matlaba pracujesz? –

Odpowiedz

2

Można zadzwonić dbclear przed użyciem dbquit

dbclear all; dbquit; 

jednak pamiętać, że będzie to także oczywiste, wszystkie punkty przerwania ustawić ręcznie, a więc jeśli używasz breakpoints dodatkowo należy raczej używać

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

Z wyjątkiem, że może to być bardziej denerwujące, jeśli używasz * także * punktów przerwania ... plus, musisz ponownie wpisać błąd 'dbstop if caught error; dbstop, jeśli błąd cały czas ... –

+0

@RodyOldenhuis Tak, masz rację; dzięki za zwrócenie na to uwagi. Zobacz moją zaktualizowaną odpowiedź. –

+0

Właściwie chciałbym obejść to, mając jeden skrót z 'dbclear if error; dbclear jeśli złapany błąd; dbquit; 'i drugi z' dbstop przy złapanym błędzie; dbstop if error; 'To tylko dwa kliknięcia. –

1

To nie jest tak, jak powinno działać. Pojedynczy dbquit powinien całkowicie usunąć z debuggera, niezależnie od tego, jak głęboko zagnieżdżone są instrukcje try/catch i jakie punkty przerwania są nadal ustawione.

Czy używasz starej wersji programu Matlab? W wersjach Matlaba przed wersją R2009b jest known bug related to dbstop if caught error, co może wywoływać takie zachowanie. Możesz uaktualnić, jeśli używasz starszej wersji.

Bez względu na wersję, spróbuj wykonać dbstop if all error zamiast oddzielnych instrukcji dbstop if error i dbstop if caught error i sprawdź, czy zachowanie się zmienia.

Podejrzewałbym też, że możesz uruchomić wiele funkcji z poziomu wiersza "K >>", a skończy się zagnieżdżonymi sesjami debuggera, ale ten, który zrobiłeś, powinien był zadbać o tę sprawę.

+0

Wersja, której używam, jest dość aktualna i nie sądzę, że problem. Domyślam się, że jest to coś w rodzaju sesji zagnieżdżonych, lub że najpierw złapię błąd (złapany przez "błąd dbstop, jeśli został złapany"), a następnie faktycznie utworzę błąd za pomocą 'dbquit', który następnie wyzwala warunek' dbstop if error'. Wypróbuję twoje rozwiązanie, gdy będę miał szansę. –