Catch none-zero final status with DicomAssociation

So far in DicomObjects, we don't throw exceptions when none-zero final status is received during the DICOM associations. The none-zero final status get passed by us and it should be the developers' responsibilities to check and, if needed, alert the user for any warnings or failures.

To catch the final status and also the related warning/error fields, you can take a look at the following code (vb6 for COM version and for the .NET version of DicomObjects).


COM Version

SCP - Setting the Error Code, Offending Element and Error Comment

It is only possible when using Asynchronous mode in the COM version that you can set the Offending Element Field (0000H, 0901H) and the Error Comment Field (0000H, 0902H):

Private Sub DicomServer1_ImageReceivedAsync(ByVal Connection As DicomObjects.DicomConnection, 
                                            ByVal Image As DicomObjects.DicomImage)
 Connection.Errors.Attributes.Add &H0000, &H0901, &H12345678
 Connection.Errors.Attributes.Add &H0000, &H0902, "My Error Comment"
 Connection.SendStatus &HC000
End Sub

SCU - Checking the Final Status and Populating the Offending Element and Error Comment

Keep in mind Offending Element and Error Comment are OPTIONAL, so they may or may not be present in the returned response. You need to make sure they are present before trying to access their values.

Dim v as Variant
Dim list as String
' cn here is a DicomConnection object, you check the returned final status after an operation, i.e. SendImages
If cn.LastStatus <> 0 Then
  If cn.ReturnedResponses(cn.ReturnedResponses.Count).Attributes(&H0, &H901).Exists And 
     cn.ReturnedResponses(cn.ReturnedResponses.Count).Attributes(&H0, &H901).Value <>  Nothing Then
    v = cn.ReturnedResponses(cn.ReturnedResponses.Count).Attributes(&H0, &H901).Value
    If (VarType(v) > 8192) Then ' We expect an array here
       For i = LBound(v, 1) To UBound(v, 1)
          list = list & Hex(v(i))
    End If
    MsgBox "LastStatus - " & cn.LastStatus
    MsgBox "Error Element - " & list
    MsgBox "Error Comment - " & cn.ReturnedResponses(cn.ReturnedResponses.Count).Attributes(&H0, &H902).Value
  End If
End If

.NET 5.4 and all previous versions

SCP - Setting the Values

Private Sub Server_InstanceReceived(ByVal sender As Object, ByVal e As DicomObjects.DicomServer.InstanceReceivedArgs) Handles Server.InstanceReceived
' For example if There is something wrong with the e.Instance, we set the final status to none-zero
 e.Errors.Add(&H0, &H901, &H12345678)
 e.Errors.Add(&H0, &H902, "My Error Comment")
 e.Status = &HC000
End Sub

SCU - Checking the status and populating the information

If cn.LastStatus <> 0 Then
   MsgBox "LastStatus - " & cn.LastStatus
   MsgBox "Error Element - " & cn.LastCommand(0, &H901).ToString()
   MsgBox "Error Comment - " & cn.LastCommand(0, &H902).ToString()
End If

Note, in the 5.4 and all previous versions, you have to use DicomAssociation object for sending instances, if you use DicomImage.Send method, you won't be able to pick up the final status, the Offending Element and Error Comment. You won't get any exception thrown by DicomObjects if the final status is not zero (success).

.NET 5.5 (16th of May 2008) and all later versions

SCP - No Difference to the 5.4 version

SCU - You have DefaultThrowStatusException

In the 5.5 (16th of May 2008) and all later versions you will have a static DicomAssociation property called DefaultThrowStatusException. The default value is false so that no one's existing program will be affected by this new addition. If set to true, DicomObjects will throw an exception when a none-zero final status is received, and developers have to put a try catch block to make sure the exception is handled in a proper way.

DicomAssociation.DefaultThrowStatusException = True
   ' You can use both the DicomImage.Send method and the DicomAssociation.SendInstances method
Catch ex As DicomException
End Try

You can also set the DefaultThrowStatusException behaviour on individual DicomAssociation basis, during the DICOM association.

DicomAssociation.DefaultThrowStatusException = True ' global setting to enable exceptions to be thrown
Dim cn As New DicomAssociation()
cn.ThrowStatusException = False ' Disable exceptions on this association, even when it is already established 

If cn.LastStatus <> 0 Then
   MsgBox "LastStatus - " & cn.LastStatus
   MsgBox "Error Element - " & cn.LastCommand(0, &H901).ToString()
   MsgBox "Error Comment - " & cn.LastCommand(0, &H902).ToString()
End If