2010-05-11 12 views
11

En las aplicaciones .Net de la consola, el depurador se rompe en el punto del lanzamiento (antes del desenrollado de la pila) para las excepciones que no tienen un bloque de catch coincidente. Parece que Silverlight ejecuta todo el código de usuario dentro de una captura de prueba, por lo que el depurador nunca se rompe. En cambio, se genera Application.UnhandledException, pero después de detectar la excepción y desenrollar la pila. Para romper cuando se lanzan excepciones no controladas y no atrapadas, tengo que habilitar los saltos de excepción de la primera oportunidad, lo que también detiene el programa para las excepciones manejadas.Cómo saltarse las excepciones no controladas en Silverlight

¿Hay alguna manera de eliminar el bloque try de Silverlight para que las excepciones lleguen directamente al depurador?

+1

¿Hay alguna razón por la que no pueda simplemente romper el controlador UnhandledException en App.xaml y examinar la excepción allí? Sé que es menos que ideal, pero le brinda toda la información que necesita. – Stephan

+1

Application.UnhandledException se plantea después desenrollando la pila. Usted tiene acceso a la traza de pila almacenada en el objeto de excepción, pero se pierde el estado de las variables locales en el momento de la proyección. –

+1

Anticipo que [IntelliTrace] (http://social.msdn.microsoft.com/Forums/en/csharpide/thread/82f03aef-ada5-4c3c-a67d-8b66d99a835b) resolverá el último problema en un futuro (SL 5?) versión. – hemp

Respuesta

5

En su proyecto web, asegúrese de que la casilla de verificación de depuración de las aplicaciones de Silverlight esté marcada. Encontrará la configuración en Propiedades de la aplicación web-> pestaña Web.

En VS2008, presiona Ctrl + Alt + E para abrir la ventana de Excepciones, marca la casilla debajo de la columna Lanzada para "Excepciones de Common Language Runtime". En VS2010, no creo que el acceso directo funcione, por lo que deberá ir a Depurar-> Excepciones en el menú desplegable.

No estoy seguro de si esto es exactamente lo que está buscando, ¡pero espero que ayude!

+0

Gracias por responder. Describo esta solución en mi pregunta. El problema es que el depurador detiene el programa incluso para excepciones que se manejarían en algún lugar de la pila de llamadas. –

4

El generador de problemas es el método DispatcherOperation.Invoke(). Se ve así:

internal void Invoke() 
{ 
    try 
    { 
     this._operation.DynamicInvoke(this._args); 
    } 
    catch (Exception exception) 
    { 
     Error.GetXresultForUserException(exception); 
    } 
} 

La cláusula de "atrapar todo" evita que el depurador de pisar en Silverlight es que falta algo similar a método de las formas de Windows.. Y no hay verificación si se está ejecutando un depurador, algo más que Winforms.

Esto no me parece muy difícil añadir, te recomiendo que publique una solicitud de función en connect.microsoft.com

Mientras tanto, no hay otra opción disponible de excepciones de depuración +, marque la Marcó la casilla de verificación para forzar al depurador a detenerse cuando se lanza la excepción. Mantenga las excepciones reservadas para lo verdaderamente excepcional.

1

utilizo el método CTRL + ALT + E (Depurar> Excepciones) para forzar el depurador de romper cuando se lanza, pero lo hago en un AS necesario y tan específico como pueda.

Si intento rastrear una excepción, buscaré su tipo en la Ventana de salida [Depurar] después de que la aplicación se bloquee por primera vez. Luego, activaré "break when throwwn" para ese tipo de excepción solo usando el botón Find en el lado derecho del diálogo.

No es perfecto, pero está tan filtrado como lo he conseguido.

9

Esto es bastante fácil, en realidad.

Haciendo uso de Application_UnhandledException event puede programar inject a breakpoint.
 

using System.IO; // FileNotFoundException 
using System.Windows; // Application, StartupEventArgs, ApplicationUnhandledExceptionEventArgs 

namespace SilverlightApplication 
{ 
    public partial class App : Application 
    { 
     public App() 
     { 
      this.Startup += this.Application_Startup; 
      this.UnhandledException += this.Application_UnhandledException; 

      InitializeComponent(); 
     } 

     private void Application_Startup(object sender, StartupEventArgs e) 
     { 
      this.RootVisual = new Page(); 
     } 

     private void Application_UnhandledException(object sender, 
      ApplicationUnhandledExceptionEventArgs e) 
     { 
      if (System.Diagnostics.Debugger.IsAttached) 
      { 
       // Break in the debugger 
       System.Diagnostics.Debugger.Break(); 

       // Recover from the error 
       e.Handled = true; 
       return; 
      } 

      // Allow the Silverlight plug-in to detect and process the exception. 
     } 
    } 
} 
+0

Lo siento, acabo de volver a leer la pregunta y me di cuenta de que ya cancelaste este enfoque porque no satisfacía tus necesidades. Sin embargo, dejaré la respuesta aquí, ya que a otra persona le puede resultar útil. – hemp

+0

+1 no sabía sobre System.Diagnostics.Debugger.IsAttached – luvieere

0

No todos los navegadores es compatible con Silverlight depuración.

Por ejemplo, no pude depurarlo con Firefox ni Chrome, solo funcionó correctamente en IE. :(

Si este no es el problema, simplemente ignorar esta respuesta.

0

clic en Depurar, elija excepciones, marcar excepciones lenguaje de ejecución común como tirado. que tenía el mismo problema y se solucionó el problema para mí

Cuestiones relacionadas