2009-03-05 3 views
6

में आयरनपीथॉन अपवाद को पकड़ना मैं सी # में आयरनपीथन 2.0 को एम्बेड कर रहा हूं। IronPython में, मैं के साथ अपने ही अपवाद परिभाषित:सी #

def foobarException(Exception): 
    pass 

और साथ कहीं न कहीं यह बढ़ा: सी # में

raise foobarException("This is the Exception Message") 

अब, मैं है:

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

क्या आपने डीबगर के साथ कोशिश की? आपको अपवाद प्रकार या आंतरिक अपवाद, या जहां भी वास्तविक पायथन अपवाद संग्रहीत किया जाना चाहिए। – OregonGhost

+0

हाँ मैंने डीबगर के साथ प्रयास किया, लेकिन इसे नहीं मिला। बात यह है कि यह आयरनपीथन 1.1 के साथ काम करता है। जब मैं ई। डेटा ["PythonExceptionInfo"] में सही ढंग से याद करता हूं तो वास्तव में पाइथन अपवाद था। संदेश। और ई। मैसेज में अपवाद का नाम था। – foobar

उत्तर

1

मेरे अंतिम समाधान था:

मैं सी # में एक परिणाम के वर्ग जो मेरे IronPython कोड के लिए पारित किया गया है। Ironpython में मैं परिणाम वर्ग को अपने सभी गणना मूल्यों के साथ भरता हूं। इस कक्षा में मैंने अभी एक सदस्य परिवर्तनीय IronPythonExceptionName जोड़ा है। अब मेरे पास आयरनपीथन में एक आसान प्रयास है:

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

यह मानते हुए कि आप संकलित .NET समकक्ष कंपाइलर के साथ आपका पायथन कोड आपके पास एक स्थिर प्रकार होगा जो कि अपवाद है। यदि यह अपवाद सार्वजनिक (निर्यात प्रकार) है तो आप उस असेंबली को संदर्भित करते हैं जिसमें आपके प्रोजेक्ट में आपके पायथन कोड शामिल हैं और कुछ पायथन नामस्थान में foobarException टाइप करें। इस तरह सी # उस अपवाद से मिलान करने में सक्षम हो जाएगा। यह एकमात्र तरीका है जिसे आप ठीक से कर सकते हैं।

3

जिस तरह से आयरनपीथन नक्शा पाइथन के .NET अपवाद हमेशा सीधा नहीं होता है; SystemError के रूप में बहुत से अपवादों की सूचना दी गई है (हालांकि यदि आप .NET अपवाद प्रकार आयात करते हैं तो आप except खंड में निर्दिष्ट कर सकते हैं)। आप आप नेट अपवाद प्रकार चाहते हैं

type(e).__name__ 

का उपयोग कर अपवाद का अजगर प्रकार प्राप्त कर सकते हैं, मॉड्यूल में import clr सुनिश्चित करें कि आपके। यह स्ट्रिंग पर ToUpper() विधि की तरह वस्तुओं पर उपलब्ध .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 

विशिष्ट नेट अपवाद को पकड़ने का एक उदाहरण आप चाहते हैं:

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

जब आप तो फिर तुम .clsException विशेषता का उपयोग नेट अपवाद उपयोग कर सकते हैं सी # से आयरनपीथन अपवाद पकड़ें, आप ट्रेसबैक प्रारूपित करने के लिए पायथन इंजन का उपयोग कर सकते हैं:

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

आप ट्रेसबैक से अपवाद नाम खींच सकते हैं। अन्यथा, अपवाद उदाहरण से सीधे जानकारी प्राप्त करने के लिए आपको IronPython hosting API में कॉल करना होगा। engine.Operations में इन प्रकार की बातचीत के लिए उपयोगी विधियां हैं।

+0

FormatException केवल SyntaxErrorException के लिए उपयोगी है, यह सिर्फ अपवाद को पुनर्जन्म देता है। किसी अन्य के लिए संदेश। – Tergiver