Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查在处理事件(.Net)时是否发生异常_.net_Vb.net_Exception Handling_Try Catch_Dispose - Fatal编程技术网

如何检查在处理事件(.Net)时是否发生异常

如何检查在处理事件(.Net)时是否发生异常,.net,vb.net,exception-handling,try-catch,dispose,.net,Vb.net,Exception Handling,Try Catch,Dispose,在处理对象时,我想检查是否发生异常,以选择是否执行提交。我正在与BAPI合作对抗SAP 如果创建运输订单(1)失败,我想取消物料单据(2)。(但这不属于问题) 当Using块结束时,对象被释放,此时我必须知道是否发生了异常 此函数不起作用,因为它在两种处理上均为true: Protected ReadOnly Property ExceptionOccurred() As Boolean Get Return Runtime.InteropServices.Marsha

在处理对象时,我想检查是否发生异常,以选择是否执行提交。我正在与BAPI合作对抗SAP

如果创建运输订单(1)失败,我想取消物料单据(2)。(但这不属于问题)

当Using块结束时,对象被释放,此时我必须知道是否发生了异常

此函数不起作用,因为它在两种处理上均为true:

 Protected ReadOnly Property ExceptionOccurred() As Boolean
    Get
        Return Runtime.InteropServices.Marshal.GetExceptionCode <> 0
    End Get
End Property

我认为你有你的尝试捕捉和你使用错误的方法。我认为您需要的模式如下:

Using sapConn3 As New SapConnectorV3
    Try   
      StartTransaction       
      ' (1) Creation of a Transport-Order
      CommitTransaction
    Catch ex As Exception
      ' (2) Cancel MaterialDocument
      RollbackTransaction
    End Try
End Using
检测到异常发生很简单,您可以将代码放入
Catch
块中以获取该异常

“它是因为发生异常而被释放的”-对象不会因为发生异常而被释放,因此无法在对象本身内部检测到这一点。考虑这些:

    Using sapConn3 As New SapConnectorV3
        Try
            'do something
        Catch ex As Exception
            'exception is thrown but object is not yet disposed
        End Try
    End Using 'object is now disposed


    Try
        Using sapConn3 As New SapConnectorV3
            'do somework
        End Using 'object is disposed here
    Catch ex As Exception
        'object must have be dispoed at this point as we are outide the using block
    End Try

因此,通过使用第一个选项,您不需要检查对象本身的内部

,您可以从相反的方向处理此问题。当发生故障时,不要试图通知您的
SapConnectionV3
对象,而是在成功时告诉它

您只需将
Complete()
CompletedSuccessfully()
或类似方法添加到
SapConnectorV3
,即可设置私有
bool
标志。使用块在离开
之前调用它。然后,在
Dispose
实现中,如果标志为true,则提交;如果标志为false,则回滚

然后,您的呼叫约定变成:

Using sapConn3 As New SapConnectorV3
    ' Do some work.
    sapConn3.Complete()
End Using ' Now this will commit if Complete was called, or roll back otherwise.

对不起,这对我不起作用。物料文档已创建并已提交。在SAP中,您无法为未提交的物料文档创建运输订单。因此,请关注“如何检查是否发生异常”。我知道这有点奇怪,但它是一个SAP接口,具有事务处理功能,而不是关系数据库。感谢您的反馈。“如何检查是否发生异常”问题的答案是代码进入catch块。您可能无法回滚事务,但仍然可以反转所做的任何操作。我编辑了代码,向您展示了我正在使用的解决方法。但不要挂断提交或回滚。我只是想知道,如果某个对象因为发生异常而被释放,我如何检查该对象的释放。对象不一定因为发生异常而被释放,但在您的代码中,该对象将在catch块中的代码运行时被释放,这就是为什么你需要改变你的使用顺序,并尝试blocksThanks获得你的回复。我也是这样做的。我直接执行提交。似乎没有真正的提示,如果我在try部分中,并且发生了异常,或者?@etalon11,该语言根本不支持这一点。异常信息不是环境信息。理论上,您可以让您的
SapConnectorV3
在关键区域内实际执行代码,方法是将其作为
操作
传入,然后它可以观察并重新抛出委托引发的任何异常;但我不认为这是一个很好的解决方案。在.NET世界中,按照我在回答中的建议去做更符合惯例。
    Using sapConn3 As New SapConnectorV3
        Try
            'do something
        Catch ex As Exception
            'exception is thrown but object is not yet disposed
        End Try
    End Using 'object is now disposed


    Try
        Using sapConn3 As New SapConnectorV3
            'do somework
        End Using 'object is disposed here
    Catch ex As Exception
        'object must have be dispoed at this point as we are outide the using block
    End Try
Using sapConn3 As New SapConnectorV3
    ' Do some work.
    sapConn3.Complete()
End Using ' Now this will commit if Complete was called, or roll back otherwise.