2009-05-15 6 views
0

IDE = VS7 oder 2002Ausnahmebehandlung - Zeile übersprungen und sqle ist null

Hallo zusammen, ich habe hier ein wirklich seltsames Problem. Der Code scheint nicht wie erwartet ausgeführt zu werden. Ich führe das durch den Debugger und es funktioniert wirklich seltsam.

Ich habe sichergestellt, dass das virtuelle Verzeichnis ASP.NET 1.0.3705 verwendet.

Der Code folgt und ich erklären, was der Debugger zeigt mir, wie die Ausführungsschritte in den Kommentaren:

try 
{ 
    objConnection.Open(); // STARTS HERE 
    objCommand.ExecuteNonQuery(); // DOES NOT THROW EXCEPTION 
    int c = 0; // THIS LINE IS EXECUTED 
} 
catch (SqlException sqle) 
{ 

    LogError(); // THIS LINE IS NOT EXECUTED 
    throw sqle; // THIS LINE IS EXECUTED AFTER THE int c = 0; 
       // sqle IS NULL 
       // EXCEPTION IS NOT CAUGHT AND 
       // EXECUTION CONTINUES IN FINALLY BLOCK 
} 
finally 
{ 
    // EXECUTES AS EXPECTED FROM HERE ON OUT, 
    // AS THOUGH THE throw sqle; DID NOT HAPPEN. 
    if (objConnection.State == ConnectionState.Open) objConnection.Close(); 
} 

Hat jemand vor diesem seltsamen Verhalten erlebt? Irgendeine Idee, wie man es repariert? Ich kann die Methode ausgiebig ändern, aber ich möchte immer noch wissen, warum das passiert.

Ich vermute, da die sqle null ist, deshalb der Wurf nicht wie erwartet verhält. Aber warum sind wir überhaupt in diesen Codeblock gesprungen?

Ich habe es mehrmals neu geladen, gespeichert und neu erstellt und mit dem Debugger ausgeführt und dieses Verhalten mehrere Male beobachtet.

Vielen Dank für Ihre Hilfe!

Alles Gute,

Graham

+0

itsmatt und David, Das Problem, soweit ich das beurteilen kann, ist mit dem Debugger. Ich folgte Davids Ratschlag, Debug.WriteLine() zu verwenden. Ich hatte einen anderen Code, der ähnliche Probleme hatte. Eine Ausnahme sollte aufgetreten sein, aber nicht. Der Debugger sah sich die if-Anweisung an und entschied, dass er den Code innerhalb ausführen sollte - was eine Ausnahme verursachen sollte. Mit Blick auf die WriteLine-Anweisungen kann ich sehen, dass der Codeblock innerhalb der if-Anweisung nicht wirklich ausgeführt wurde. Es ist ein Unterschied, wie der Debugger denkt, dass der Code ausgeführt wird und wie er ausgeführt wird. Danke für Ihre Hilfe –

+0

Schön das zu hören. Klingt wie die kompilierte Assembly, die der Debugger betrachtet, älter als die Quelle ist. Sie könnten versuchen, den Ordner/bin zu löschen und das Projekt erneut zu erstellen. – VVS

Antwort

0

Warten .. Ihr Code fragen, warum er nicht den catch-Block auszuführen ist keine Ausnahme und Sie werfen?

EDIT (Referenzierung Ihren Kommentar):

Das ist wirklich schwer zu glauben, klingt. Ich habe nie von einem Fall gehört, in dem die tatsächliche Ausnahme innerhalb des catch-Blocks null war und wie Sie bereits erwähnt haben, wurde die erste Zeile innerhalb des catch-Blocks nicht ausgeführt, was meiner Meinung nach in die Richtung zeigt, dass es überhaupt keine Ausnahme gab.

Haben Sie versucht, den Programmablauf zu überprüfen, indem Sie altmodische Debugging-Techniken (Debug.WriteLine) verwenden und den Debugger überspringen?

Meine Annahme ist, dass Sie an dem falschen Ort suchen, wo die Ausnahme ausgelöst wird .. oder es gibt keine Ausnahme.

+0

Es gibt einen Catch, der ausgeführt wird, obwohl keine Ausnahme ausgelöst wird. Innerhalb dieses Catch gibt es einen throw [Ich habe diesen Code nicht geschrieben] und die throw-Zeile wird ausgeführt, aber die Ausnahme ist null und wird nicht abgefangen. –

+0

itsmatt und David, Das Problem, soweit ich das beurteilen kann, ist mit dem Debugger. Ich folgte Davids Ratschlag, Debug.WriteLine() zu verwenden. Ich hatte einen anderen Code, der ähnliche Probleme hatte. Eine Ausnahme sollte aufgetreten sein, aber nicht. Der Debugger hat sich die if-Anweisung angesehen und entschieden, dass er den Code innerhalb ausführen sollte - was eine Ausnahme verursachen sollte. Mit Blick auf die WriteLine-Anweisungen kann ich sehen, dass der Codeblock innerhalb der if-Anweisung nicht wirklich ausgeführt wurde. Es ist ein Unterschied, wie der Debugger denkt, dass der Code ausgeführt wird und wie er ausgeführt wird. Danke für Ihre Hilfe –

+0

IIRC, diese Version des Debuggers hatte Probleme. Es sieht so aus, als würden Sie eine Codezeile ausführen, dann würde es Zeilen überspringen oder andere seltsame Dinge tun. Ich denke, es wurde in späteren Versionen behoben. Sie können es möglicherweise durch Ausräumen des bin-Ordners und Neuaufbau beheben. –

1

Sehr seltsam. Ich bin mir nicht sicher, was mit Ihrem Code vor sich geht, aber eine Sache, die ich sah, ist die Verwendung von:

catch (SqlException sqle) 
{ 

    LogError(); // THIS LINE IS NOT EXECUTED 
    throw sqle; // THIS LINE IS EXECUTED AFTER THE int c = 0; 
       // sqle IS NULL 
       // EXCEPTION IS NOT CAUGHT AND 
       // EXECUTION CONTINUES IN FINALLY BLOCK 
} 

Sie wollen schreiben:

catch (SqlException sqle) 
{ 

    LogError(); 
    throw; 
} 

Um die Ausnahme erneut zu werfen.

+0

Die erste Version ist überhaupt nicht falsch. Sie töten nur die Stack-Trace. – VVS

+0

Ich habe nicht gesagt, dass es falsch ist, aber es wäre sicherlich sinnvoller, die vollständige Stack-Trace zu sehen, in der Regel. Danke, dass du darauf hingewiesen hast. Ich hatte es versäumt, das in meinen Kommentar aufzunehmen. – itsmatt