簡體   English   中英

觸發事件時在函數調用中引發異常

[英]Raise exception in function call when event is triggered

我有一個VB.NET類Flasher用於通過.Flash()方法刷新具有某些固件的設備。 但是,在刷新過程中可能會發生錯誤,在這種情況下將觸發事件。 我無法弄清楚如何處理此事件並在.Flash()的調用堆棧中引發異常。

Class Flasher
    Private myDevice As New FlashLib.Device

    Public Function Flash() As String
        AddHandler myDevice.ErrorEvent, AddressOf OnError
        '... Do flashing stuff here that might send our `ErrorEvent` ...'
        myDevice.flash_firmware("myfirmware.fw")
        myDevice.restart()
        Threading.Thread.Sleep(5000)
        return "OK"
    End Function

    Public Sub OnError(ByRef Err As ErrEventArgs)
        errMsg = String.Format(
            "Device threw an error during flashing process. Type: {0}",
            Err.error)
        Throw New System.Exception(errMsg)
    End Sub

Flasher類取決於C#庫FlashLib ,它是ErrorEvent的始發者:

namespace FlashLib
{
    public delegate void ErrorEventHandler(ErrEventArgs err);

    public interface Device
    {
        event ErrorEventHandler ErrorEvent;
    }
}

問題是當我實例化Flasher並調用.Flash() ,想法是如果發生錯誤事件, .Flash()的調用者將引發異常,但是在.Flash()執行的中間跳出的是該函數並進入OnError() 我的catch子句未捕獲從此處引發異常的情況:

Dim flasher As New Flasher
Try
    flasher.Flash()
Catch
    Debug.Print("There was a problem with flashing")
End Try

相反,異常上升到頂部,並且顯示錯誤消息框。 然后,從Flash()方法中中斷的地方繼續執行並繼續執行。 似乎VB.NET中的事件的行為就像軟件中斷一樣:跳出您在處理程序中所做的任何操作,然后恢復之前的狀態? 我需要Flash()的調用方能夠在觸發ErrorEvent時捕獲異常。

不是讓您的OnError方法拋出異常,而是讓它設置一個可以在Flash測試的標志,然后在發現異常的情況下拋出該異常。 例如

Class Flasher
    Private myDevice As New FlashLib.Device
    Private errMsg As String

    Public Function Flash() As String
        AddHandler myDevice.ErrorEvent, AddressOf OnError
        '... Do flashing stuff here that might send our `ErrorEvent` ...'

        If errMsg IsNot Nothing Then
            Throw New System.Exception(errMsg)
        End If

        myDevice.flash_firmware("myfirmware.fw")
        myDevice.restart()
        Threading.Thread.Sleep(5000)
        return "OK"
    End Function

    Public Sub OnError(ByRef Err As ErrEventArgs)
        errMsg = String.Format(
            "Device threw an error during flashing process. Type: {0}",
            Err.error)
    End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM