2015-06-09 9 views
14

Il seguente codice dovrebbe essere eseguiti senza interrompere il debugger:first-chance-eccezione, ma debugger disabili Stopps all'interno try ... catch quando si utilizza IronPython

var engine = Python.CreateEngine(AppDomain.CurrentDomain); 
var source = engine.CreateScriptSourceFromString("Foo.Do()"); 
var compiledCode = source.Compile(new PythonCompilerOptions { Optimized = true }); 

try 
{ 
    compiledCode.Execute(
     engine.CreateScope(
      new Dictionary<string, object> { 
              { "Foo", new Foo() } 
              })); 

    MessageBox.Show("Executed without error"); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(string.Format("Error at execution: {0}", ex.Message)); 
} 

Utilizzando questa classe:

public class Foo 
{ 
    public void Do() 
    { 
     throw new InvalidOperationException("The debugger should not break here..."); 
    } 
} 

L'esecuzione dello script viene eseguita in un blocco try per gestire qualsiasi eccezione. Se ho codice come 1/0, tutto funziona perfettamente. L'eccezione è creata in Python (o nel motore) e il mio catch-block viene chiamato come previsto senza forzare il debugger a fermarsi ovunque.

Chiamare try { new Foo().Do(); } catch {} in C# funziona anche senza arrestare il debugger.

Ma lanciare un'eccezione nel codice C# invocato in python costringerà il debugger a fermarsi alla riga throw new....

Non voglio che il debugger si fermi qui.

Ho disabilitato le prime eccezioni di possibilità in Debug/Exceptions ma il debugger si ferma ancora al lancio.

Non riesco a utilizzare DebuggerStepThrough perché nel mio codice di lavoro l'eccezione non è stata generata in questo metodo ma è più profonda nel codice. Il codice viene anche utilizzato da C# e decorare tutti questi metodi con DebuggerStepThrough renderà obsoleto il debugger C#.

Una soluzione è disabilitare le eccezioni User-unhandled in Debug/Exceptions ma voglio interrompere ad eccezioni che non sono gestite dall'utente, quindi questa non è un'opzione.

Cosa posso fare per disabilitare l'eccezione first-chance chiamata dal codice python eseguita in un blocco try ... catch?

+0

Il codice Python contiene try/catch? Presumibilmente non è così, ora si arriva ad essere una chiamata di giudizio in cui dovrebbe essere localizzato il "miglior" posto per l'interruzione del debugger. In qualche modo prevedibile, ciò non avverrà in un punto in cui il codice Python non è più eseguibile e la sorgente effettiva dell'eccezione non è più visibile. Dovresti eliminare il file PDB per quel codice C# per convincere il debugger che non è "My Code". –

+0

Ne vedi? No, contiene solo 'Foo.Do()'. Non è stato possibile eliminare il PDB perché c'è un sacco di altri codici che dovrebbero essere debellati normalmente. –

+0

Non ne ho visto nessuno, non hai pubblicato il tuo codice Python. C'era qualche ragione per essere snarky a riguardo? –

risposta

1

Molto probabilmente, hanno un opzione di default controllato nelle impostazioni di debug che sta causando questo:

enter image description here

Assicurarsi che la casella è selezionata e si dovrebbe essere a posto. Speriamo che questo aiuti!

+0

Ottima idea. Non ho controllato prima. ... Questa casella di controllo è deselezionata ma il debugger si ferma ancora :-( –