偶数处理程序代码块中的未处理异常

时间:2011-03-29 09:04:19

标签: dll exception-handling event-handling c++-cli

我在C ++ / CLI中编写一个在基于C#的GUI应用程序中调用的DLL。我抛出一个自定义异常(派生自Exception类),如果我的DLL中没有吞下它,则在GUI代码的最后一个catch块中处理。它适用于所有投掷,除了一个:

我的DLL我已经实现了一个侦听SerialPort::DataReceived事件的处理程序。如果我得到一个不正确的数据包,我会引发一个自定义异常,它会在外部的try-catch块中重新抛出。 GUI应该显示此自定义异常。但由于某种原因,此块中引发的异常不会被重新抛出。相反,我在调试模式下收到“未处理的异常”消息。当我通过双击exe(在发布文件夹中)直接运行exe时,它只是崩溃。显然,GUI不处理此事件处理程序方法中引发的异常。或者也许他们没有从我的DLL传递到GUI。它不会为我的其他部分造成问题。我能想到这种不同行为的唯一原因是事件处理程序没有调用者。我猜是正确的吗?还是有其他原因。关于如何处理这个问题的任何线索?我不希望我的应用程序崩溃。我只是想引发异常,以便可以在GUI中向用户显示消息,并且应用程序可以停止与串行端口通信。

1 个答案:

答案 0 :(得分:1)

在从该事件处理程序抛出之前,您需要切换到UI线程。这通常使用System::Threading::SynchronizationContext来完成,但如果您使用的是WinForms,则可以使用System::Windows::Forms::Control::BeginInvokeSystem::Windows::Forms::Control::Invoke