Catching Exceção IronPython em C #
-
03-07-2019 - |
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"
}
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.