6

IronPython 2.0をC#に埋め込んでいます。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"
}
4

4 に答える 4

16

C# から IronPython 例外をキャッチすると、Python エンジンを使用してトレースバックをフォーマットできます。

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

トレースバックから例外名を引き出すことができます。それ以外の場合は、IronPython ホスティング API を呼び出して、例外インスタンスから直接情報を取得する必要があります。engine.Operationsには、この種の相互作用に役立つメソッドがあります。

于 2009-03-08T18:39:15.613 に答える
3

IronPythonが.NET例外をPython例外にマップする方法は、必ずしも簡単ではありません。多くの例外がとして報告されSystemErrorます(ただし、.NET例外タイプをインポートする場合は、except句で指定できます)。例外のPythonタイプは、次を使用して取得できます。

type(e).__name__

.NET例外タイプが必要な場合はimport clr、モジュールにあることを確認してください。文字列のメソッドのように、オブジェクトで.NET属性を使用できるようにToUpper()します。.clsException次に、属性を使用して.NET例外にアクセスできます。

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'
于 2009-03-05T15:06:34.420 に答える
1

私の最終的な解決策は次のとおりです。

Ironpython コードに渡される C# の結果クラスがあります。Ironpython では、結果クラスにすべての計算値を入力します。このクラスに、メンバー変数 IronPythonExceptionName を追加しました。ここで、IronPython で簡単に試してみました。

try: 
    complicatedIronPythonFunction()
except Exception, inst:
    result.IronPythonExceptionName = inst.__class__.__name__
    raise inst
于 2009-04-21T11:32:11.153 に答える
0

.NETと同等のコンパイラを使用してPythonコードをコンパイルしたとすると、静的型がありますが、これは例外です。この例外がパブリック(エクスポートされたタイプ)の場合は、プロジェクトでPythonコードを含むアセンブリを参照し、Python名前空間でタイプfoobarExceptionを掘り下げます。そうすれば、C#はその例外とタイプマッチできるようになります。これはあなたがそれを適切に行うことができる唯一の方法です。

于 2009-03-05T11:39:55.710 に答える