2010-08-20 32 views
6

Tôi có một ứng dụng C# gọi một hàm trong một dll C++. Hàm này có thể ném nhiều ngoại lệ khác nhau thừa kế std::exception. Tôi hiện đang nắm bắt các ngoại lệ này như sau:Làm thế nào để có được một mô tả lỗi std :: ngoại lệ khi gọi một C++ dll từ C#

try 
{ 
    //Call to C++ dll 
} 
catch (System.Exception exception) 
{ 
    //Some error handling code 
} 

Câu hỏi đầu tiên của tôi là mã này sẽ bắt tất cả std::exception? Câu hỏi thứ hai của tôi là làm thế nào tôi có thể lấy chuỗi std::exception::what, nếu tôi kiểm tra exception.Message Tôi chỉ nhận được "Thành phần bên ngoài đã ném một ngoại lệ".

EDIT: Các chức năng trong câu hỏi là trong một tổ chức phi quản lý C++ dll, và nhập khẩu như thế này trong C# lớp:

[DllImport("SomeDLL.dll")] 
public extern static void SomeFunction(); 
+0

Có một phương pháp ToString trả về một chuỗi đại diện của ngoại lệ hiện hành. http://msdn.microsoft.com/en-us/library/system.exception_members.aspx – DumbCoder

+2

http://stackoverflow.com/questions/150544/can-you-catch-a-native-exception-in-c- code/150596 # 150596 – celavek

Trả lời

0

Gọi như thế nào? CLR không thực sự "có được" C + + xử lý ngoại lệ. Nếu bạn gọi mã C++ thông qua COM, thêm một lớp bắt std :: exception và bọc nó với một HRESULT/IErrorInfo. Nếu bạn gọi nó thông qua quản lý C++, thêm một lớp kết thúc tốt đẹp nó trong một System.Exception quản lý, vv

+0

Tôi đã cập nhật câu hỏi của mình –

+1

Nguyên tắc tương tự áp dụng cho PInvoke. Dễ dàng tìm thấy một số giao thức khác để báo cáo lỗi. Sử dụng các giá trị trả về, tham số đầu ra và/hoặc hàm SetLastError của Windows chẳng hạn. –

0

Cách tốt nhất để đi là xử lý ngoại lệ trong C++ và lưu thông báo lỗi ở đâu đó. Sau đó, trong C# bạn có thể kiểm tra xem có một thông báo lỗi đã được lưu hay không và liệu bạn có thể truy xuất nó hay không.

C++:

try 
{ 
    //do some processing 
} 
catch(std::exception& ex) 
{ 
    // errorMessage can be a std::string 
    errorMessage = ex.what(); 
} 

C#:

[DllImport("SomeDLL.dll")] 
public extern static void SomeFunction(); 
[DllImport("SomeDLL.dll")] 
public extern static string GetError(); 

SomeFunction(); 
string Error = GetError(); 
if(String.IsNullOrEmpty(Error)==true) 
{ 
    //The processing was successfull 
} 
else 
{ 
    //The processing was unsuccessful 
    MessageBox.Show(Error); 
} 
+0

Và nếu đó là mã của bên thứ ba, tôi không có khả năng sửa đổi nó? – qub1n

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