Catch non-zero final status with DicomAssociation
In DicomObjects, we don’t throw exceptions when non-zero final status is received during the DICOM associations. The non-zero final status get passed by us and it should be the developers' responsibility 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 vb.net for the .NET version of DicomObjects).
DicomObjects.NET
SCP - Setting the Values
private void Server_InstanceReceived(object Sender, DicomObjects.EventArguments.InstanceReceivedArgs e)
{
// For example if There is something wrong with the e.Instance's Patient Name
// we set the final status to non-zero
e.Errors.Add(Keyword.OffendingElement, 0x00100010);
e.Errors.Add(Keyword.ErrorComment, "invalid patient name");
e.Status = 0xC000;
}
SCU - Checking the status and populating the information - manually
DicomAssociation cn;
// ... ...
cn.SendInstances(imgs);
if (cn.LastStatus != 0)
{
int lastStatus = cn.LastStatus;
string offendingElement = cn.LastCommand[Keyword.OffendingElement].Value.ToString();
string errorComment = cn.LastCommand[Keyword.ErrorComment].Value.ToString();
}
cn.Close();
SCU - Using DefaultThrowStatusException
There is a static DicomAssociation property called DefaultThrowStatusException. The default value is false , but if set to true, DicomObjects will throw an exception when a non-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 cn;
// ...
cn.ThrowStatusException = true;
try
{
cn.Open("ip", 104, "callingAET", "calledAET");
cn.SendInstances(imgs);
}
catch (Exception ex)
{
// exception handling
}
You can also set the DefaultThrowStatusException behaviour on individual DicomAssociation basis, during the DICOM association.
DicomAssociation cn;
// ...
cn.Open("ip", 104, "callingAET", "calledAET");
cn.ThrowStatusException = false;
cn.SendInstances(imgs);
DicomObjects.COM
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))
Next
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