Classic Error Handling

If you do not use exception handling, you need to explicitly check $procerror for errors immediately after each relevant ProcScript instruction, and handle the error in some way.

For example:

trigger retrieve
  retrieve
  selectcase $procerror
   case 0 ; ok
   case -2, -4
     message/info "Retrieve: No data found in the database."
   elsecase
     message/error "Retrieve: Error occurred - (%%($procerror))."
  endselectcase
  return 0
end

Uniface ProcScript instructions set $procerror to a negative value when something goes wrong while executing the instruction. Additional information about the error is provided in $procerrorcontext, and depending on the ProcScript instruction, in $procreturncontext or $dataerrorcontext.

If the error is not handled immediately after the relevant ProcScript command, it is ignored and code execution continues. A subsequent instruction may also result in an error, and set a different value for $procerror, so the original error information is lost. This makes it difficult to trace the origin of a problem back to the command that caused it.

You can write error handling code that deals with errors that are specific to a ProcScript command, as in the previous example. Or you can create a generic error handler that can be called after relevant ProcScript instructions. For example:

call getChild(vTargetUrl, vTargetObject)
  #include uError:handler  ; IncludeScript that deals with negative $procerror values
vPos = pTarget->position
  #include uError:handler

Other Uses of ProcScript Error

Sometimes, the value of $procerror can be used as exit condition in loops. For example:

setocc "MYENT", 1
while ($procerror != -1203)  ; no more occurrences
  $1 = $curocc("MYENT")
  setocc "MYENT", $curocc("MYENT") + 1
endwhile

Related Topics