2010-04-29 8 views
10

Ich möchte in der Lage sein, Ausnahmen beim Debuggen ... wie in Visual Studio 2008 Menü Debug/Exception Dialog, außer meinem Programm hat viele gültige Ausnahmen, bevor ich zu dem Bit, das ich debuggen wollen, zu brechen.Kann ich Unterbrechungen bei Ausnahmen programmatisch aktivieren/deaktivieren?

Also statt es manuell zu aktivieren und deaktivieren Sie es mit dem Dialogfeld jedes Mal ist es möglich, es automatisch mit einem #pragma oder eine andere Methode, so dass es nur in einem bestimmten Stück Code passiert? wenn innerhalb oder außerhalb von Debug

+0

Ich glaube nicht, können Sie, aber ich weiß nicht genau. –

+1

Ihr Programm hat viele gültige Ausnahmen? Was bedeutet das? –

+1

Das bedeutet, dass ich Bibliotheken verwende, die Ausnahmen verwenden, um Bedingungen im Code zu melden. Sie sind Warnungen und nicht fatal und sind Teil der API, also kann ich sie nicht stoppen und muss sie fangen und entsprechend codieren. – AnthonyLambert

Antwort

6

Die einzige Möglichkeit, etwas in der Nähe zu tun, besteht darin, das DebuggerNonUserCodeAttribute auf Ihre Methode zu setzen.

Dadurch wird sichergestellt, dass Ausnahmen in der markierten Methode keine Unterbrechung bei der Ausnahme verursachen.

Gute Erklärung davon here ...

Dies ist ein Attribut, das Sie eine Methode setzen gegen den Debugger zu sagen „nichts mit mir zu tun guv‘. Ist das nicht mein Code“. Der leichtgläubige Debugger wird Ihnen glauben und wird diese Methode nicht unterbrechen: Wenn Sie das Attribut verwenden, überspringt der Debugger die Methode vollständig, auch wenn Sie Code durchgehen. Ausnahmen, die auftreten und dann in der Methode abgefangen werden, werden nicht in den Debugger einbrechen.Es behandelt es so, als wäre es ein Aufruf einer Framework-Assembly. Sollte eine Ausnahme nicht behandelt werden, wird sie in dem Code, der die Methode aufgerufen hat, eine Ebene höher als der Aufruf-Stack gemeldet.

Code-Beispiel:

public class Foo 
{ 
    [DebuggerNonUserCode] 
    public void MethodThatThrowsException() 
    { 
     ... 
    { 
} 
1

Ihre try catch-Blöcke in #if DEBUG Wickeln

public void Foo() 
    { 
     #if DEBUG 
     try 
     #endif 
     { 
      //Code goes here 
     } 
     #if DEBUG 
     catch (Exception e) 
     { 
      //Execption code here 
     } 
     #endif 
    } 

ich außerhalb der geschweiften Klammern zu halten wie der #if diese Weise den Code im gleichen Umfang hält.

Wenn Sie immer noch die execption Handeling wollen aber mehr Details möchten, können Sie dies tun

 try 
     { 
      //code 
     } 
     catch (FileNotFoundException e) 
     { 
      //Normal Code here 
      #if DEBUG 
      //More Detail here 
      #endif 
     } 
     #if DEBUG 
     catch (Exception e) 
     { 
      //handel other exceptions here 
     } 
     #endif 
+0

etwas mit so aussieht ein wenig sauberer ist: [Conditional ("Debug")] private void MyMethod() { ... } –

+0

Mein Problem ist mit dem Versuch fangen nicht aber auf dem Wurf in Debug zu brechen. ... – AnthonyLambert

2

Was conditional breakpoints? Wenn ich richtig verstehe, können Sie einen Haltepunkt nur dann auslösen, wenn der Wert einer bestimmten Variablen oder eines Ausdrucks wahr ist.

1

Dies ist ein bisschen zu spät für Sie, aber das ist der größte Grund, warum ich oft versuche, Menschen zu lehren, Ausnahmen konservativ zu verwenden. Benutze nur Ausnahmen, wenn etwas katastrophales passiert ist und deine Fähigkeit, vernünftig fortzufahren, verschwunden ist.

Wenn ich ein Programm debugge, schalte ich oft Erste-Chance-Ausnahmen (Debug -> Exceptions) ein, um eine Anwendung zu debuggen. Wenn es viele Ausnahmen gibt, ist es sehr schwierig herauszufinden, wo etwas "falsch" passiert ist.

Außerdem führt es zu einigen Anti-Patterns wie dem berüchtigten "Catch Throw" und verschleiert die wahren Probleme. Für weitere Informationen hierzu siehe eine blog post Ich habe zu dem Thema gemacht.

In Bezug auf Ihr Problem können Sie das Debuggen der ersten Chance nur für einen bestimmten Ausnahmetyp aktivieren. Dies sollte gut funktionieren, wenn die anderen Ausnahmen nicht vom selben Typ sind.

+0

Ich empfehle, dass Sie Ausnahmen für Warnungen und schwerwiegende Ausnahmen implementieren, die nach Funktion gruppiert sind. Sie können nur diejenigen aktivieren/deaktivieren, die Sie abfangen möchten. Ich denke, Ausnahmen sollten nicht nur richtig verwendet werden! Mein Problem ist, dass ich nicht den gesamten Code geschrieben habe, der Ausnahmen erzeugt, und sie verwenden allgemeine Ausnahmen überall, so dass es schwierig ist, sie zu unterscheiden. – AnthonyLambert

0

Sie könnten statt Breakpoints auch assets verwenden. Zum Beispiel, wenn Sie nur auf der 5. Iteration einer Schleife auf dem zweiten Mal zu Breakpoint wollen Sie diese Funktion aufrufen, können Sie tun:

bool breakLoop = false; 

... 
    Work(); // Will not break on 5th iteration. 
    breakLoop = true; 
    Work(); // Will break on 5th iteration. 
... 

public void Work() { 
    for(int i=0 ; i < 10 ; i++) { 
     Debug.Assert (!(breakLoop && i == 5)); 
     ... 
    } 
} 

So im ersten Aufruf zu arbeiten, während breakLoop falsch ist, die Die Schleife wird ohne Aktivierung durchlaufen, das zweite Mal durch die Schleife wird unterbrochen.

+1

Sie können die Hit Count-Funktion an regulären Haltepunkten verwenden, um dies auch ohne Code zu erreichen. – Jeremy

+0

Wahr, für die Hälfte von dem, was ich demosting war, aber ich versuchte, ein generelles Prinzipal der Verwendung von Konfigurationsvariablen sowie Bedingungen zu demonstrieren, wann Asserts ausgelöst werden. –