Pergunta

Estou a incorporação de IronPython 2.0 em C #. Em IronPython, eu defini minha própria exceção com:

def foobarException(Exception):
    pass 

e elevá-la em algum lugar com:

raise foobarException( "This is the Exception Message" )

Agora em C #, eu tenho:

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"
}
Foi útil?

Solução 3

A minha solução final foi:

Eu tenho uma classe resultado em C # que é passado para o meu código de IronPython. Em IronPython eu encho a classe resultado com todos os meus valores computados. Para esta classe I acabou de adicionar um IronPythonExceptionName variável de membro. Agora eu só tenho uma chance simples no IronPython:

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

Outras dicas

Quando você capturar uma exceção IronPython de C #, você pode usar o motor Python para formatar o rastreamento:

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

Você pode puxar o nome de exceção fora do rastreamento. Caso contrário, você terá que chamar o API hospedagem IronPython para recuperar informações diretamente a partir da instância exceção. engine.Operations tem métodos úteis para esses tipos de interações.

A forma IronPython mapeia exceções .NET para aqueles Python nem sempre é simples; um monte de exceções são relatados como SystemError (embora se você importar o tipo de exceção .NET você pode especificar que na cláusula except). Você pode obter o tipo Python da exceção usando

type(e).__name__

Se você quer o tipo de exceção NET, verifique se você tem import clr no módulo. Faz atributos .NET disponível apenas em objetos, como o método ToUpper() em cordas. Em seguida, você pode acessar a exceção .NET usando o atributo .clsException:

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

impressões:

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

Um exemplo de captura a exceção .NET específico que você deseja:

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

Assumindo que você compilou o código python com o compilador equivalente .NET você teria um tipo estático que é apenas essa exceção. Se essa exceção é público (tipo exportado), então você faz referência o assembly que contém o código python em seu projeto e cavar o foobarException tipo em algum namespace python. Dessa forma, C # será capaz de tipo de correspondência que exceção. Esta é a única maneira que você pode fazer isso corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top