¿Por qué el comportamiento de bloqueo de manejo de captura (TException) difiere bajo el depurador después de instalar Visual Studio 2008?
Considere la aplicación de consola a continuación, que presenta un método con un controlador de captura genérico que detecta excepciones de tipoTException
.
Cuando esta aplicación de consola se compila con la configuración 'Depurar' y se ejecuta bajo el depurador de Visual Studio (es decir, a través de * .vshost.exe) esto falla, tanto en Visual Studio 2005 como en Visual Studio 2008.
Creo que este problema solo surgió después de instalar Visual Stuido 2008.
using System;
class Program
{
static void Main()
{
Console.WriteLine(Environment.Version);
CatchAnException<TestException>();
Console.ReadKey();
}
private static void CatchAnException<TException>()
where TException : Exception
{
Console.WriteLine("Trying to catch a <{0}>...", typeof(TException).Name);
try
{
throw new TestException();
}
catch (TException ex)
{
Console.WriteLine("*** PASS! ***");
}
catch (Exception ex)
{
Console.WriteLine("Caught <{0}> in 'catch (Exception ex)' handler.", ex.GetType().Name);
Console.WriteLine("*** FAIL! ***");
}
Console.WriteLine();
}
}
internal class TestException : Exception
{
}
En las siguientes circunstancias, el código se comporta como se esperaba:
Si está construido con la configuración 'Release', tiene éxito. Si se ejecuta a través de * .exe directamente, en lugar de a través de Visual Studio (F5), tiene éxito. Si adjunta un depurador poniendoSystem.Diagnostics.Debugger.Launch();
en la línea 1 deMain()
todavía tiene éxito.Cuando la aplicación de consola se inicia desde Visual Studio (2005 o 2008) y, por lo tanto, se ejecuta en ConsoleApplication.vshost.exe, falla.
Aquí está mi salida para el caso de falla
2.0.50727.3068
Trying to catch a <TestException>...
*** FAIL! ***
Caught <TestException> in 'catch (Exception ex)' handler.
Expected: <TestException>
Actual: <TestException>
Result of typeof(TException) == ex.GetType() is True
¿Qué está causando este peculiar fracaso?