2009-10-29 11 views
38

Tengo un código que genera una gran cantidad de ArgumentExceptions en una línea en particular (que está en un código de desarrollador diferente, por lo que no puedo simplemente cambiarlo), que luego son atrapados y manejados adecuadamente.Depuración de Visual Studio: ¿ignorar la excepción en un lugar mientras se interrumpe en otro lugar?

Estoy tratando de depurar ArgumentExceptions que están sucediendo en una sección diferente de código (y luego son capturados y manejados, por lo que no puedo simplemente mirar las excepciones no controladas).

¿Hay alguna forma de ignorar las ArgumentExceptions que se originan en esa otra línea de código en particular, al mismo tiempo que se rompen en ArgumentExceptions que se lanzan a otra parte?

+0

http://support.microsoft.com/kb/308469 – madcolor

Respuesta

37

Es posible que pueda hacer esto, pero depende de cómo se encuentre el código que desea depurar en relación con el código del otro desarrollador, y si puede o no modificar (pero no confirmar los cambios) a su código.

Lo primero que querrá hacer es, al menos temporalmente, vaya al menú Herramientas -> Opciones -> depuración en Visual Studio, y marque la casilla "Sólo mi código". Supongo que esto está disponible incluso en ediciones Express, pero puede no ser así, y si no está disponible para ti, me temo que el resto de lo que tengo que decir probablemente no ayude.

De todos modos, una vez que haya marcado eso, ya no verá notificaciones de interrupción de tiro para el código que no es "suyo". Esto significa código que proviene de un ensamblaje que no está en su.sln, o código marcado con el atributo [DebuggerNonUserCode] de System.Diagnostics. Lo que generalmente hago entonces es decorar temporalmente los métodos ofensivos con [DebuggerNonUserCode] hasta que termine de depurar lo que necesito depurar, y luego revertir esos cambios antes de registrarme en el control de fuentes.

No es tan elegante como me gustaría (me encantaría una casilla de verificación "nunca más salgan de los tiros de este sitio" en el asistente de excepción), pero es mejor que nada.

Creo que puede haber otras configuraciones de depuración que puedan interactuar con el funcionamiento de "Just My Code", por lo que si esto no funciona, házmelo saber e intentaré obtener una imagen más precisa de lo que la configuración se parece a cuando hago esto.

+1

La opción "Just My Code" no está disponible en el cuadro de diálogo Opciones en algunas versiones Express de Visual Studio (aunque está en Visual C# 2010 Express), pero se puede cambiar por otros medios: * [¿Cómo desactivo? Just My Code 'en Visual Basic 2005 Express?] (Http://stackoverflow.com/questions/12790806) *. –

+0

Tenga en cuenta que aunque la opción también está disponible para C++, no tiene ningún efecto en las excepciones, como se describe aquí: http://msdn.microsoft.com/en-us/library/dn457346.aspx – pjcard

+1

Curiosamente, [ DebuggerNonUserCode] aún detiene el depurador en la función principal: http://stackoverflow.com/questions/39382551 – crokusek

2

Si sabe cómo lo está llamando, establecería el punto de interrupción en su código y luego pasaría a (F11) desde allí. También podría golpear al programador hasta que arregle su código, lo que tendría el efecto de hacer que se sienta mejor (a menos que sea pacifista) y tal vez no tengan tantos ArgumentExceptions en su código (lo que probablemente lo haría sentir mejor). incluso si eres un pacifista).

+0

Anthony acaba de ganar Internet !!! Bien, ok ... StackOverflow, no en internet. Y sí, está bien ... tal vez 'solo' es un poco inapropiado ya que esto fue hace 4 1/2 años pero ... bueno ... eh ... oh, olvídalo. ¡Solo acepta la victoria y sigue! – MarqueIV

3

Si está hablando de la función de excepción "Break On Throw", entonces no la hay. Es estrictamente una característica basada en el tipo solamente y no tiene ninguna forma de controlar qué sección del código arroja la excepción.

Su mejor opción es colocar puntos de interrupción en todas las líneas que arrojen o suspendan temporalmente lanzando una excepción desde el único lugar que le interese.

1

Suena como usar excepciones como control de flujo. Si el que está tratando de depurar ocurre más adelante en el programa, puede intentar adjuntar el depurador más tarde o puede esperar hasta que el programa se esté ejecutando para activarse cuando se lanza una excepción ArgumentException.

Trate de limitar el alcance también - si la excepción que le interesa proviene de, pero no es exactamente ArgumentException, rompa esa en su lugar.

Indique al otro desarrollador que corrija el código.

Editar: En .NET 4, se puede adjuntar un controlador para el evento AppDomain.FirstChanceException, filtrar excepitons no ArgumentException y filtrar el malo basado en la pila de llamadas.

0

Los enlaces en los comentarios son geniales.

Creo que los puntos de interrupción condicional son lo que está buscando aquí. Puede hacer esto haciendo clic con el botón derecho en su punto de interrupción y haciendo clic en el elemento de menú Condición ...

+0

Desafortunadamente, el depurador Visual Studio no es tan bueno como GDB; en particular, no puede establecer un comando a una excepción para verificar una condición y continuar si esta es la excepción que no desearíamos. –

Cuestiones relacionadas