سؤال

وأنا التضمين و IronPython 2.0 في C #. في و IronPython، I تعريف استثناء بلدي مع:

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 I ملء الطبقة النتيجة مع كل القيم المحسوبة بلدي. لهذه الدرجة أنا فقط واضاف عضوا IronPythonExceptionName متغير. الآن لدي مجرد محاولة بسيطة في و IronPython:

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

نصائح أخرى

عند التقاط استثناء و IronPython من C #، يمكنك استخدام محرك بيثون لتنسيق traceback:

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

ويمكنك سحب اسم استثناء من traceback. خلاف ذلك، سيكون لديك للدعوة إلى API استضافة و IronPython لاسترداد المعلومات مباشرة من مثيل استثناء. engine.Operations ديه طرق مفيدة لهذا النوع من التفاعلات.

والطريقة خرائط و IronPython استثناءات .NET لتلك بيثون ليست دائما واضحة. يتم الإبلاغ عن الكثير من الاستثناءات كما SystemError (ولكن إذا قمت باستيراد صافي نوع استثناء يمكنك تحديد أن في شرط except). يمكنك الحصول على نوع بيثون الاستثناء باستخدام

type(e).__name__

إذا كنت ترغب في. NET نوع استثناء، تأكد من حصولك على import clr في الوحدة النمطية. يجعل صافي سمات متاح في الأشياء، مثل طريقة ToUpper() على الاوتار. ثم يمكنك الوصول إلى استثناء. NET باستخدام السمة .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'

وعلى افتراض أن كنت ترجمة التعليمات البرمجية الثعبان مع المترجم يعادل صافي عملتم نوع ثابت الذي هو مجرد هذا الاستثناء. إذا كان هذا الاستثناء هو العام (اكتب تصدير) فإنك مرجع التجميع الذي يحتوي على رمز الثعبان الخاص في المشروع ونبش foobarException نوع في بعض مساحة الثعبان. بهذه الطريقة C # سوف تكون قادرة على كتابة تطابق هذا الاستثناء. هذه هي الطريقة الوحيدة التي يمكنك القيام بذلك بشكل صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top