2009-03-05 27 views
6

Tôi đang nhúng IronPython 2.0 vào C#. Trong IronPython, tôi định nghĩa ngoại lệ của riêng tôi với:Bắt ngoại lệ Ironpython trong C#

def foobarException(Exception): 
    pass 

và nâng cao nó ở đâu đó với:

raise foobarException("This is the Exception Message") 

Bây giờ trong C#, tôi 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" 
} 
+0

Bạn đã thử bằng trình gỡ lỗi chưa? Bạn sẽ thấy loại ngoại lệ hoặc ngoại lệ bên trong, hoặc bất cứ nơi nào ngoại lệ python thực tế được lưu trữ. – OregonGhost

+0

vâng tôi đã thử với một trình gỡ rối, nhưng không thể tìm thấy nó. Vấn đề là nó làm việc với IronPython 1.1. Khi tôi nhớ chính xác trong e.Data ["PythonExceptionInfo"] có thực sự là python exception.message. Và trong e.Message có tên của Ngoại lệ. – foobar

Trả lời

1

Giải pháp cuối cùng của tôi là:

Tôi có lớp kết quả bằng C# được chuyển đến mã ironpython của tôi. Trong Ironpython tôi điền vào lớp kết quả với tất cả các giá trị tính toán của tôi. Để lớp này tôi chỉ cần thêm một biến thành viên IronPythonExceptionName. Bây giờ tôi chỉ có một thử đơn giản trong IronPython:

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

Giả sử bạn biên soạn mã python của bạn với trình biên dịch tương đương .NET bạn sẽ có một kiểu tĩnh mà chỉ là ngoại lệ đó. Nếu ngoại lệ này là public (export type) thì bạn tham khảo assembly có chứa mã python của bạn trong dự án của bạn và khai thác kiểu foobarException trong một số không gian tên python. Bằng cách đó C# sẽ có thể nhập khớp với ngoại lệ đó. Đây là cách duy nhất bạn có thể làm điều đó đúng cách.

3

Cách IronPython ánh xạ ngoại lệ .NET cho Python không phải lúc nào cũng đơn giản; rất nhiều trường hợp ngoại lệ được báo cáo là SystemError (mặc dù nếu bạn nhập loại ngoại lệ .NET bạn có thể chỉ định trong mệnh đề except). Bạn có thể nhận được các loại Python của ngoại lệ sử dụng

type(e).__name__ 

Nếu bạn muốn .NET loại ngoại lệ, chắc chắn rằng bạn có import clr trong mô-đun. Nó làm cho các thuộc tính .NET có sẵn trên các đối tượng, như phương thức ToUpper() trên các chuỗi. Sau đó, bạn có thể truy cập ngoại lệ NET sử dụng .clsException thuộc tính:

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

in:

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

Một ví dụ về đánh bắt NET ngoại lệ cụ thể mà bạn muốn:

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

Khi bạn bắt ngoại lệ IronPython từ C#, bạn có thể sử dụng công cụ Python để định dạng traceback:

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

Bạn có thể kéo tên ngoại lệ ra khỏi truy xuất lại. Nếu không, bạn sẽ phải gọi vào API lưu trữ IronPython để lấy thông tin trực tiếp từ cá thể ngoại lệ. engine.Operations có các phương pháp hữu ích cho các loại tương tác này.

+0

FormatException chỉ hữu ích cho SyntaxErrorException, nó chỉ sửa lại Exception.Message cho bất kỳ người nào khác. – Tergiver

Các vấn đề liên quan