2010-05-11 13 views
11

Nelle applicazioni .Net della console, il debugger si interrompe nel punto del lancio (prima dello srotolamento dello stack) per le eccezioni senza blocco catch corrispondente. Sembra che Silverlight esegua tutto il codice utente all'interno di un try catch, quindi il debugger non si interrompe mai. Invece, Application.UnhandledException viene sollevata, ma dopo aver catturato l'eccezione e aver srotolato lo stack. Per interrompere quando vengono lanciate e non catturate eccezioni non gestite, devo abilitare le interruzioni delle eccezioni di prima scelta, che interrompono anche il programma per le eccezioni gestite.Come risolvere le eccezioni non gestite in Silverlight

C'è un modo per rimuovere il blocco try di Silverlight, in modo che le eccezioni arrivino direttamente al debugger?

+1

C'è un motivo per cui non è possibile interrompere il gestore di UnhandledException in App.xaml ed esaminare l'Eccezione lì? So che non è l'ideale ma fornisce tutte le informazioni necessarie. – Stephan

+1

Application.UnhandledException viene generato dopo sganciare lo stack. Si ha accesso alla traccia stack memorizzata nell'oggetto eccezione, ma lo stato delle variabili locali al momento del lancio viene perso. –

+1

Prevedo che [IntelliTrace] (http://social.msdn.microsoft.com/Forums/en/csharpide/thread/82f03aef-ada5-4c3c-a67d-8b66d99a835b) risolverà l'ultimo problema in un futuro (SL 5?) versione. – hemp

risposta

5

Nel progetto Web, verificare che la casella di controllo del debug delle applicazioni Silverlight sia selezionata. Troverai le impostazioni sotto la scheda Proprietà-> Web dell'applicazione.

In VS2008, premere Ctrl + Alt + E per visualizzare la finestra delle eccezioni, selezionare la casella sotto la colonna generata per "Common Language Runtime Exceptions". In VS2010, non credo che la scorciatoia funzioni, quindi dovrai accedere a Debug-> Eccezioni dal menu a discesa.

Non sono sicuro se questo è esattamente quello che stai cercando, ma speriamo che sia d'aiuto!

+0

Grazie per aver risposto. Descrivo questa soluzione alternativa nella mia domanda. Il problema con esso è che il debugger arresta il programma anche per le eccezioni che sarebbero state gestite da qualche parte nello stack delle chiamate. –

4

Il trouble maker è il metodo DispatcherOperation.Invoke(). Ecco come si presenta:

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

La clausola di "prendere tutto" impedisce il debugger dal fare un passo in Silverlight manca qualcosa di simile a metodo le forme di Windows.. E non c'è alcun controllo se un debugger è in esecuzione, qualcos'altro fa Winforms.

Questo non mi sembrano molto difficile aggiungere, vi consiglio di inviare una richiesta di funzionalità a connect.microsoft.com

Nel frattempo, non c'è altra opzione disponibile di debug + Eccezioni, spuntare la Casella di controllo generata per forzare l'arresto del debugger quando viene generata l'eccezione. Mantieni le eccezioni riservate per le cose veramente eccezionali.

1

uso il CTRL + ALT + E (Debug> Eccezioni) metodo per forzare il debugger di rompere quando viene lanciato, ma lo faccio su una come base necessaria e il più mirato possibile.

Se sto cercando di rintracciare un'eccezione, cercherò il suo tipo nella finestra di output [Debug] dopo che l'app si arresta in modo anomalo la prima volta. Quindi accenderò "break when throw" per quel tipo di eccezione solo usando il pulsante Find sul lato destro della finestra di dialogo.

Non è perfetto, ma è filtrato come l'ho ottenuto.

9

Questo è abbastanza facile, in realtà.

L'utilizzo di Application_UnhandledException event è possibile a livello di programmazione 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

Scusa - Ho appena riletto la domanda e mi sono reso conto che hai già eliminato questo approccio perché non soddisfa le tue esigenze. Lascerò la risposta qui, però, dato che qualcun altro potrebbe trovarlo utile. – hemp

+0

+1 non sapeva di System.Diagnostics.Debugger.IsAttached – luvieere

0

Non tutti i browser supporta il debug di Silverlight.

Ad esempio, non è stato possibile eseguire il debug con Firefox o Chrome, ha funzionato correttamente solo in IE. :(

Se questo non è il problema, ignorare questa risposta.

0

fare clic su Debug, scegliere eccezioni, marchio comune eccezioni lingua di runtime come gettato. Ho avuto lo stesso problema e risolto il problema per me

Problemi correlati