2009-03-05 19 views
6

Umieszczam IronPython 2.0 w języku C#. W IronPython, ja zdefiniowane własne wyjątek z:Wyławianie wyjątku Ironpythona w języku C#

def foobarException(Exception): 
    pass 

i podnieść go gdzieś z:

raise foobarException("This is the Exception Message") 

Teraz w C#, mam:

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" 
} 
+0

Czy próbowałeś tego z debuggerem? Powinieneś zobaczyć typ wyjątku lub wyjątek wewnętrzny lub gdziekolwiek przechowywany jest faktyczny wyjątek Pythona. – OregonGhost

+0

Tak, próbowałem z debuggerem, ale nie mogłem go znaleźć. Chodzi o to, że pracował z IronPythonem 1.1. Kiedy dobrze pamiętam w e.Data ["PythonExceptionInfo"] faktycznie był python exception.message. W e.Message była nazwa wyjątku. – foobar

Odpowiedz

1

Moje ostateczne rozwiązanie było:

Mam klasy wynik w C#, który jest przekazywany do mojego kodu IronPython. W Ironpython wypełniam klasę wyników wszystkimi obliczonymi wartościami. Do tej klasy właśnie dodałem zmienną członkowską IronPythonExceptionName. Teraz po prostu mam prostą próbę w IronPython:

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

Zakładając, że skompilowany Twój kod Pythona z kompilatorem .NET, który miałby być statycznym typem, który jest właśnie tym wyjątkiem. Jeśli ten wyjątek jest publiczny (typ wyeksportowany), odwołujesz się do złożenia zawierającego kod Pythona w projekcie i wykrywasz typ foobarException w niektórych obszarach nazw Pythona. W ten sposób C# będzie w stanie wpisać dopasować ten wyjątek. Jest to jedyny sposób, w jaki możesz to zrobić właściwie.

3

Sposób, w jaki IronPython mapuje wyjątki .NET do Pythona, nie zawsze jest prosty; wiele wyjątków jest zgłaszanych jako SystemError (chociaż w przypadku importowania typu wyjątku .NET można to określić w klauzuli except). Można uzyskać typu Python z wyjątkiem korzystania

type(e).__name__ 

Jeśli chcesz typ wyjątku .NET, upewnij się, że import clr w module. Udostępnia atrybuty .NET na obiektach, na przykład metodę ToUpper() dla łańcuchów. Następnie można uzyskać dostęp do wyjątek .NET przy użyciu atrybutu .clsException:

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

drukuje:

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

Przykładem łapanie specyficzny wyjątek .NET chcesz:

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

kiedy wychwycić wyjątek IronPython z C#, można użyć silnika Python do sformatowania traceback:

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

Możesz wyciągnąć nazwę wyjątku poza ścieżkę zwrotną. W przeciwnym razie będziesz musiał wywołać interfejs API hostingu IronPython, aby pobrać informacje bezpośrednio z instancji wyjątku. engine.Operations ma przydatne metody dla tego rodzaju interakcji.

+0

FormatException jest przydatny tylko dla wyjątku SyntaxErrorException, po prostu zwraca wartość Exception.Message dla wszystkich innych. – Tergiver

Powiązane problemy