Ein Kollege fand in seiner VB.net-Lösung ein verdrahtetes Debugger-Verhalten. Ich gebe zu, dass dies eher eine akademische Frage sein wird, da dies nur die Reihenfolge der hervorgehobenen Anweisungen beim Debuggen beeinflusst und nicht das Gesamtverhalten des Codes. Also für alle neugierig da draußen:Seltsames Debugger-Verhalten in VB.net
Wir diese Mindestkonsolenanwendung auf die folgende abgespeckte:
Private Sub PlayWithExceptions
Dim a = 2
Try
throw new Exception("1")
Catch ex As Exception
If a = 2 Then
Dim x = New XElement("Dummy")
Else
throw
End If
End Try
End Sub
Sub Main()
Try
PlayWithExceptions()
Catch ex As Exception
End Try
End Sub
Wie sich der Debugger throws Exception („1“) und dem Debugger springt in die catch-Klausel von PlayWithExceptions Methode. Da "a" immer 2 ist, springt der Debugger zu einem Dummy-Code (New XElement ...), von dort zum "End If" und schließlich zurück in das Else-Blatt auf die throw-Anweisung. Ich gestehe, dass Visual Studio die Ausnahme nicht erneut auslöst, aber trotzdem sieht es sehr seltsam aus.
Ändern der Bedingung "Wenn a = 2" in "If True" beseitigt dieses Verhalten.
Das Refactoring auf bedingte Fänge eliminiert dieses Verhalten ebenfalls.
Private Sub PlayWithExceptions
Dim a = 2
Try
throw new Exception("1")
Catch ex As Exception When a = 2
Dim x = New XElement("Dummy")
Catch ex As Exception
throw
End Try
End sub
Das Übersetzen dieser wenigen Zeilen in C# zeigt dieses Verhalten ebenfalls nicht.
private static void PlayWithExceptions()
{
var a = 2;
try
{
throw new Exception("1");
}
catch (Exception)
{
if (a == 2)
{
var x = new XElement("Dummy");
}
else
{
throw;
}
}
}
static void Main(string[] args)
{
try
{
PlayWithExceptions();
}
catch (Exception ex)
{
}
}
Wir versuchen NET3.5 und .Net4.6 sowie die Ziele AnyCPU und x86 ohne Auswirkung auf den oben VB-Code. Der Code wurde mit den Standard-Debug-Einstellungen und ohne weitere Optimierungen ausgeführt. Wir haben VS2015 Update 3 verwendet.
Hat jemand eine Idee, warum Visual Studio vorgibt, die Ausnahme in VB neu zu werfen (aber ohne es wirklich neu zu werfen)? Es sieht beim Debuggen verwirrend aus ...
Ich denke, das kann nur jemand vom vb.net/vs Debugger-Team beantworten –