2013-03-07 6 views
5

Mam funkcję w kodzie C#, w której wyjątek NullReferenceException jest okresowo zgłaszany (oczekiwane zachowanie), ale przechwycony. Czy jest sposób, w jaki mogę powiedzieć debugger Visual Studio, aby nie złamać tego wyjątku dla tej konkretnej sekcji mojego kodu?Selektywnie ignoruj ​​zgłaszane wyjątki w kodzie C#

EDIT Muszę przerwać ten wyjątek w innym miejscu w moim kodzie, ale nie w tej samej funkcji.

+4

Dobrym sposobem na to jest, aby nie pozwolić mu się stało. Dlaczego nie jesteś w stanie temu zapobiec? –

+1

To może być zewnętrzny kod poza jego kontrolą. – Pondidum

+1

Nie chodzi o to, że nie jestem w stanie, to kod, który odziedziczyłem i staram się nie dotykać go zbyt dużo, dopóki nie naprawię niektórych błędów, które go dręczą. Zasadniczo mam kilka szybkich poprawek, które muszę przekazać klientom zanim przejdę i przepisać wszystko. –

Odpowiedz

11

Jeśli dobrze rozumiem, a próbujesz zrobić, to usunąć niektóre wyjątki NullReferenceException, ale chcesz tymczasowo zignorować inne podczas debugowania, możesz to zrobić, zaznaczając funkcje, które mają być ignorowane przez debugowanie za pomocą atrybut DebuggerNonUserCode.

[DebuggerNonUserCode] 
private void MyMethod() 
{ 
    // NullReferenceException exceptions caught in this method will 
    // not cause the Debugger to stop here.. 
} 

UWAGA, że to będzie działać tylko wtedy, gdy wyjątki zostały złowione w wymienionych metod. Chodzi o to, że nie spowodują one uszkodzenia debuggera, jeśli masz ustawiony wyjątek debuggera, aby zawsze łamać na NullReferenceException. A to działa tylko na metodach, a nie na arbitralnych sekcjach kodu wewnątrz metody.

+0

To jest rzeczywiście idealne do tego, co muszę zrobić. To nie jest trwała zmiana, mniej lub bardziej po prostu coś, co pomoże mi teraz debugować. –

+0

@MikyDinescu: Wow, nauczyłem się czegoś nowego, dziękuję (i +1). – leppie

+0

dlatego kochamy TAK - wszyscy się czegoś uczymy;) –

-1

Możesz to zrobić, ale ma to wpływ na wszystkie wyjątki w rozwiązaniu.

Debug -> Exceptions -> Find... "Null Ref", de-tick Thrown.

+1

Ponownie, nadal potrzebuje go, aby przerwać ten wyjątek na resztę swojego kodu, jest tylko jedno miejsce, w którym chce je zignorować. – BrainSlugs83

1

Założenie, że wyjątek nie występuje w rozmowach z dzwoniącym, można uzyskać za pomocą DebuggerHiddenAttribute.

Z uwagi

Visual Studio 2005 debugger nie zatrzymuje w sposobie oznaczonym tego atrybutu i nie pozwala na przerwania należy ustawić w metodzie .

[DebuggerHidden] 
    private static void M() 
    { 
     try 
     { 
      throw new NullReferenceException(); 
     } 
     catch (Exception) 
     { 
      //log or do something useful so as not to swallow. 
     }    
    } 
+0

Co staram się zrobić, jaka jest różnica między określeniem atrybutu [DebuggerNonUserCode] a atrybutem [DebuggerHidden]? –

+0

@BasedAsFunk - Clarity. Jeśli ukrywasz kod, ponieważ jego, powiedzmy, wygenerowany i nie powinien być oglądany przez użytkownika końcowego, to DebuggerNonUserCode identyfikuje ten zamiar. Jednakże, jeśli chcesz mieć funkcję, która jest ignorowana przez debuggera, to funkcja ukrywania debuggera identyfikuje tę intencję. –

+3

Nie działa. Debugger po prostu zatrzymuje się o jeden poziom wyżej. Wyjątkiem NIE jest bulgotanie, jest on przechwytywany, ale debugger zachowuje się tak, jakby to zrobił. (Ilekroć zrobisz krok, wyraźnie widzisz, że to nie jest bulgotanie, ale przerwa wciąż się zdarza. - BARDZO CIEKAJĄC.) – BrainSlugs83

Powiązane problemy