문제

C#에 Ironpython 2.0을 포함하고 있습니다. Ironpython에서는 다음과 함께 내 자신의 예외를 정의했습니다.

def foobarException(Exception):
    pass 

그리고 어딘가에 다음과 같이 키 웁니다.

raise foobarException( "This is the Exception Message" )

이제 C#에는 다음과 같습니다.

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"
}
도움이 되었습니까?

해결책 3

나의 최종 해결책은 다음과 같습니다.

C#의 결과 클래스가 Ironpython 코드로 전달됩니다. Ironpython에서는 모든 계산 된 값으로 결과 클래스를 채 웁니다. 이 클래스에 방금 멤버 변수 ironpythonexceptionName을 추가했습니다. 이제 Ironpython에서 간단한 시도를했습니다.

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

다른 팁

C#에서 Ironpython 예외를 잡으면 Python 엔진을 사용하여 Traceback을 포맷 할 수 있습니다.

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

트레이스 백에서 예외 이름을 가져올 수 있습니다. 그렇지 않으면 예외 인스턴스에서 직접 정보를 검색하려면 Ironpython 호스팅 API를 호스팅해야합니다. engine.Operations 이러한 종류의 상호 작용에 유용한 방법이 있습니다.

Ironpython이 Python을 예외로지도하는 방식이 항상 간단한 것은 아닙니다. 많은 예외가보고됩니다 SystemError (.NET 예외 유형을 가져 오면 except 절). 사용을 사용하여 예외의 파이썬 유형을 얻을 수 있습니다.

type(e).__name__

.NET 예외 유형을 원한다면 import clr 모듈에서. .NET 속성을 ToUpper() 문자열에 대한 방법. 그런 다음 .clsException 기인하다:

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

인쇄물:

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

원하는 특정 .NET 예외를 포착하는 예 :

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

.NET 등가 컴파일러로 파이썬 코드를 컴파일한다고 가정하면 그 예외는 정적 유형을 가질 수 있습니다. 이 예외가 공개 (내보낸 유형) 인 경우 프로젝트에 Python 코드가 포함 된 어셈블리를 참조하고 일부 Python 네임 스페이스에서 fooBarexception 유형을 파헤칩니다. 이렇게하면 C#이 해당 예외 일치를 입력 할 수 있습니다. 이것이 제대로 할 수있는 유일한 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top