Domanda

Sto incorporando IronPython 2.0 in C #. In IronPython, ho definito la mia eccezione con:

def foobarException(Exception):
    pass 

e sollevalo da qualche parte con:

raise foobarException( "This is the Exception Message" )

Ora in C #, ho:

try
{
   callIronPython();
}
catch (Exception e)
{
   // How can I determine the name (foobarException) of the Exception
   // that is thrown from IronPython?   
   // With e.Message, I get "This is the Exception Message"
}
È stato utile?

Soluzione 3

La mia soluzione finale è stata:

Ho una classe di risultato in C # che viene passata al mio codice ironpython. In Ironpython riempio la classe del risultato con tutti i miei valori calcolati. A questa classe ho appena aggiunto una variabile membro IronPythonExceptionName. Ora ho solo un semplice tentativo in IronPython:

try: 
    complicatedIronPythonFunction()
except Exception, inst:
    result.IronPythonExceptionName = inst.__class__.__name__
    raise inst

Altri suggerimenti

Quando si rileva un'eccezione IronPython da C #, è possibile utilizzare il motore Python per formattare il traceback:

catch (Exception e)
{
    ExceptionOperations eo = _engine.GetService<ExceptionOperations>(); 
    string error = eo.FormatException(e); 
    Console.WriteLine(error);
}

È possibile estrarre il nome dell'eccezione dal traceback. Altrimenti, dovrai chiamare l'API di hosting IronPython per recuperare le informazioni direttamente dall'istanza dell'eccezione. engine.Operations ha metodi utili per questo tipo di interazioni.

Il modo in cui IronPython mappa le eccezioni .NET a quelle di Python non è sempre semplice; molte eccezioni sono riportate come SystemError (sebbene se importi il ??tipo di eccezione .NET puoi specificarlo nella clausola tranne ). Puoi ottenere il tipo Python dell'eccezione usando

type(e).__name__

Se si desidera il tipo di eccezione .NET, assicurarsi di avere import clr nel modulo. Rende disponibili gli attributi .NET sugli oggetti, come il metodo ToUpper () sulle stringhe. Quindi puoi accedere all'eccezione .NET usando l'attributo .clsException :

import clr
try:
    1/0
except Exception, e:
    print type(e).__name__
    print type(e.clsException).__name__

stampe:

ZeroDivisionError      # the python exception
DivideByZeroException  # the corresponding .NET exception

Un esempio di acquisizione dell'eccezione .NET specifica desiderata:

from System import DivideByZeroException
try:
    1/0
except DivideByZeroException:
    print 'caught'

Supponendo che tu abbia compilato il tuo codice Python con il compilatore equivalente .NET, avresti un tipo statico che è solo quell'eccezione. Se questa eccezione è pubblica (tipo esportato), fai riferimento all'assembly che contiene il tuo codice Python nel tuo progetto e scava il tipo foobarException in alcuni spazi dei nomi Python. In questo modo C # sarà in grado di digitare match quell'eccezione. Questo è l'unico modo per farlo correttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top