处理从dll内部抛出的异常

时间:2012-05-17 18:11:48

标签: vb.net visual-studio-2008 error-handling ads

我正在为一所装载dll的学校项目工作。

加载的dll是我的程序和Twincat System Manager之间的桥梁,它通过本地网络在计算机和PLC之间形成桥梁。

我需要通过从plc到我的程序的整个链读取变量。

这就是我这样做的方式:

Public Function adsReadReal(ByVal Variabelenaam As String) As Single
    Dim ds = New TwinCAT.Ads.AdsStream(4 * 8) ' new data stream
    Dim br = New System.IO.BinaryReader(ds) 'new binary
    Dim hVar = New Integer
    Try
        ConState(1) 
        tcclient = New TcAdsClient
        ConState(2)
        tcclient.Connect(Form1.amsAdress, 801) 'connects the tcclient to the PLC
        hVar = tcclient.CreateVariableHandle(Variabelenaam) 'creats a handle for the variable
        tcclient.Read(hVar, ds) 'read it
        ConState(5)
        Return br.ReadSingle() 'convert it from binary to readable for vb
    Catch ex As Exception
        ConState(0)
        PrintEx(ex) 'print out the exception
    finally
        tcclient.Dispose() 'make the object stop being used to prevent a lingering connection
    End Try
    Return False
End Function

现在程序在连接模块的开头加载一个名为TwinCAT.ADS.dll的dll。如果Twincat系统管理器正在运行,程序正常结束,但当它不是崩溃并给我这个错误时:

  

System.DllNotFoundException未处理
  消息=“Kan DLL tcadsdll.dll niet laden:Kan opgegeven module niet vinden。(Uitzondering van HRESULT:0x8007007E)”

  来源= “TwinCAT.Ads”
  类型名= “”
  堆栈跟踪:
    bij TwinCAT.Ads.Internal.TcAdsDllWrapper.TcAdsDll.AdsAmsUnRegisterRouterNotification()
    bij TwinCAT.Ads.Internal.TcAdsDllWrapper.AmsUnRegisterRouterNotification(布尔值   throwAdsException)
    bij TwinCAT.Ads.Internal.TcLocalSystem.Dispose(布尔处理)
    bij TwinCAT.Ads.Internal.TcLocalSystem.Finalize()

大致翻译为:

  

无法加载DLL tcadsdll.dll:找不到给定的模块。 (例外情况   HRESULT:0x8007007E)

这不是我导入的dll,因此它必须来自TwinCAT.ADS.dll

如何防止程序向我抛出此错误,而是平静地关闭程序?我试图抓住每个dll相关操作的所有例外。

此消息来源也是Bitbucket。我会根据要求公开。

Beckhoff官方网站上的一些链接:

http://infosys.beckhoff.com/espanol.php?content=../content/1034/tcquickstart/html/tcquickstart_samplevisualbasicnet.htm&id=10449

修改 显然使用tcclient.dispose()导致错误,因为finnaly语句是使用而不是在try块之后

编辑:这当前捕获异常,但它无法处理它。

Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler
Dim tick As Byte = 0

Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs)
   Dim ex As Exception = DirectCast(args.ExceptionObject, Exception)
   MsgBox("exception tick" & Str(tick))
   tick = tick + 1
   PrintEx(ex)
End Sub

修改 该异常未被正确捕获,因为在vs2008中发生了一些错误但在按F5后出现了勾号(续)

当程序直接运行时,我只看到1个Tick。然后Windows出错了。

1 个答案:

答案 0 :(得分:0)

您是否尝试过未处理的异常处理程序?

Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler

Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs)
   Dim e As Exception = DirectCast(args.ExceptionObject, Exception)
   Console.WriteLine("MyHandler caught : " + e.Message)
End Sub