Visual Studio: ¿Cómo romper las excepciones manejadas?

165

Me gustaría que Visual Studio se interrumpiera cuando ocurra una excepción manejada (es decir, no solo quiero ver un mensaje de "Primera oportunidad", quiero depurar la excepción real).

Por ejemplo, quiero que el depurador se rompa en la excepción:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

Encontré estas notas para Visual Studio.NET:

1) En VS.NET, vaya al Menú de depuración >> "Excepciones ..." >> "Excepciones de Common Language Runtime" >> "Sistema" y seleccione "System.NullReferenceException"

2) En la parte inferior de ese cuadro de diálogo hay un cuadro de grupo "Cuando se lanza la excepción:", seleccione "Irrumpir en el depurador"

3) Ejecute su escenario. Cuando se lanza la excepción, el depurador se detendrá y le notificará con un cuadro de diálogo que dice algo como: "Se ha lanzado una excepción de tipo" System.NullReferenceException ". [Interrupción] [Continuar]"

Golpear [Romper]. Esto lo pondrá en la línea de código que está causando el problema.

Pero no se aplican a Visual Studio 2005 (no hay una opción de Excepciones en el menú Depurar ).

¿Alguien sabe dónde encuentra este cuadro de diálogo de opciones en Visual Studio que el cuadro de grupo " Cuando se lanza la excepción ", con la opción de " Irrumpir en el depurador "?

Actualización: El problema era que mi menú Depurar no tenía un elemento de Excepciones . Personalicé el menú para agregarlo manualmente.

Ian Boyd
fuente
9
En VS2015 estaba en Debug-> Windows-> Exception Settings
PeterVermont
Me llevó un tiempo encontrar cómo restaurar la configuración de excepciones predeterminada después de cambiar algunas de las configuraciones de excepción, por lo tanto, una nueva respuesta. restaurar la configuración de excepción a la predeterminada
Mabito

Respuestas:

170

Con una solución abierta, vaya a la opción de menú Depuración - Excepciones ( Ctrl+ D, E). Desde allí, puede optar por interrumpir las excepciones lanzadas o no manejadas por el usuario .

EDITAR: Mi instancia está configurada con el "perfil" de C #, ¿tal vez no está allí para otros perfiles?

Austin Salonen
fuente
10
Simplemente no tengo esa opción. Eso explicaría mi confusión.
Ian Boyd
58
Tuve el menú de depuración, pero no hay opciones de excepciones. personalicé el menú para agregarlo manualmente; la tecla de acceso directo funcionó en ambos sentidos (Ctrl + Alt + E)
Ian Boyd
3
Además, puede restablecer el entorno VS2010 yendo a "Herramientas", "Importar configuración de exportación" y seleccionar un restablecimiento al entorno C # ... contiene el elemento del submenú Excepciones
BeardinaSuit
14
Seleccioné Common Language Runtime Exceptions> <All Common Language Runtime Exceptions not in this list>en Visual Studio 2017 y todos mis sueños más salvajes se hicieron realidad.
Aaron Newton el
9
Visual Studio 2015: Depuración -> Windows -> Configuración de excepciones
achecopar
47

Hay una ventana de 'excepciones' en VS2005 ... intente Ctrl+ Alt+ Eal depurar y haga clic en la casilla de verificación 'Lanzar' para la excepción en la que desea detenerse.

Rob Walker
fuente
Eso es exactamente lo que quiero. ¿Dónde está eso en el menú? Por mi vida no puedo encontrarlo.
Ian Boyd
El método abreviado de teclado puede cambiar según el perfil (desarrollador de C #, desarrollador de C ++, etc.)
Asaf R
1
Tengo un elemento de menú: Depurar -> Excepciones. Esto es con VS2005 Professional. ¿Estás ejecutando una edición Express?
Rob Walker
55
si desea el elemento del menú Excepciones: Seleccione Herramientas | Personalizar .... Haga clic en la pestaña Comandos. Seleccione la categoría Depurar en el cuadro Categorías. Busque el elemento de comando Excepciones ..., luego arrástrelo al menú Depurar en la parte superior de la aplicación, colocándolo en el lugar apropiado del menú. (encontrado en los comentarios en: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/… )
sotto
33

Me tomó un tiempo encontrar el nuevo lugar para la configuración de expection, por lo tanto, una nueva respuesta.

Desde Visual Studio 2015 usted controla qué Excepciones detenerse en la Ventana de Configuración de Excepción (Depuración-> Windows-> Configuración de Excepción). El atajo sigue siendo Ctrl- Alt- E.

La forma más sencilla de manejar excepciones personalizadas es seleccionar "todas las excepciones que no están en esta lista".

Aquí hay una captura de pantalla de la versión en inglés:

ingrese la descripción de la imagen aquí

Aquí hay una captura de pantalla de la versión alemana:

ingrese la descripción de la imagen aquí

Principiante
fuente
16

Desde Visual Studio 2015 y en adelante, debe ir al cuadro de diálogo "Configuración de excepciones" ( Ctrl+ Alt+ E) y marcar las "Excepciones de Common Language Runtime" (o una específica que desee, es decir ArgumentNullException) para que se rompa en las excepciones manejadas .

Paso 1 Paso 1 Paso 2 Paso 2

Sameer Alibhai
fuente
8

Compruebe Administrar excepciones con la página del depurador , explica cómo configurar esto.

Básicamente, estos son los pasos (durante la depuración):

  1. En el menú Depurar, haga clic en Excepciones.

  2. En el cuadro de diálogo Excepciones, seleccione Lanzado para una categoría completa de excepciones, por ejemplo, Excepciones de Common Language Runtime.

    -o-

    Expanda el nodo para una categoría de excepciones, por ejemplo, Common Language Runtime Exceptions, y seleccione Lanzado para una excepción específica dentro de esa categoría.

Guy Starbuck
fuente
1

Una técnica que uso es algo como lo siguiente. Defina una variable global que pueda usar para uno o varios bloques catch de prueba según lo que esté tratando de depurar y use la siguiente estructura:

if(!GlobalTestingBool)
{
   try
   {
      SomeErrorProneMethod();
   }
   catch (...)
   {
      // ... Error handling ...
   }
}
else
{
   SomeErrorProneMethod();
}

Creo que esto me da un poco más de flexibilidad en términos de pruebas porque todavía hay algunas excepciones que no quiero que rompa el IDE.

Spencer Ruport
fuente
3
Esta es una técnica útil: convierte la excepción controlada en una excepción no controlada, por lo que el depurador se detiene automáticamente. No estoy seguro de por qué fue rechazado, a menos que fuera porque no hay una buena manera de configurar su GlobalTestingBool. Otra opción, posiblemente mejor, es usar Debugger.IsAttached.
Joe White
Tendría que agregar esto alrededor de cada intento / captura y recompilar su código. No es muy útil si ya estás en medio de la depuración de algo.
Max
Se debe incluir una excepción en el código si hay una condición excepcional, algo inaceptable, y se debe detectar a un nivel en el que se pueda tomar una decisión sobre cómo manejarlo. Un código como este complica las rutas de ejecución.
Lee Oades
Sé que esta es una respuesta muy antigua, pero para googlers aleatorios como yo, simplemente puede agregarcatch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan 'splite' K.
0

La documentación en línea parece un poco confusa, así que acabo de realizar una pequeña prueba. Si elige interrumpir en Lanzar desde el cuadro de diálogo Excepciones, la ejecución del programa se interrumpirá en cualquier excepción, manejada o no manejada. Si solo quiere romper las excepciones manejadas, parece que su único recurso es revisar su código y poner puntos de interrupción en todas sus excepciones manejadas. Esto parece un poco excesivo, por lo que podría ser mejor agregar una declaración de depuración cada vez que maneje una excepción. Luego, cuando vea esa salida, puede establecer un punto de interrupción en esa línea en el código.

markysdad
fuente