What it means
User abend codes don't come from z/OS. A program, a utility or a product picks the number and issues the abend itself. So U0016 has no single meaning across all jobs. It means the program running in that step decided to stop with code 16, and 16 is the number many programs use for a severe error.
Don't confuse it with return code 16. A step that ends normally with return code 16 shows COND CODE 0016 in message IEF142I, and later steps run or not according to the job's COND or IF logic. An abend shows ABEND=S000 U0016 in IEF450I, and later steps are skipped unless they are coded to run after an abend.
Common causes
- An application program that found a problem it can't continue from, such as a control total that doesn't match or a missing header record, and called the site's standard abend routine or the Language Environment service CEE3ABD with code 16.
- A vendor utility or product that uses 16 as its abend code for a severe error.
- DFSORT set up to abend on failure. When DFSORT can't complete and its ABEND option is in effect, it issues a user abend instead of ending with return code 16. The ABCODE installation option sets the code, either a fixed number from 1 to 99 or the number of the error message. Sites that set 16 see U0016.
How to find the problem
- Find the step and the program. IEF450I names the step, and the EXEC statement for that step shows the program, for example
PGM=SORT,PGM=ICETOOLor one of your own. - Read that step's own output first, its SYSOUT, SYSPRINT or message data set. Whatever issued the abend almost always explains why just before it.
- For DFSORT, look for messages that start with ICE and end in A. Those are the error messages, and they name the problem, such as a bad control statement or a data set mismatch.
- For your own programs, search the source for the abend call with code 16, and read the program's DISPLAY output for the error it reported.
- If the step has a SYSUDUMP, SYSABEND or CEEDUMP, it shows where the abend was issued. For a deliberate abend that is usually inside the abend routine, so the program's messages tell you more than the dump.
How to fix it
- Fix the condition the program reported. That might be an input file, a control card, or data that failed a check.
- For DFSORT, correct the control statements or data set definitions the ICE message names, then rerun the step.
- Whether DFSORT abends or returns code 16 is set by its ABEND and NOABEND options. Changing that changes how failures stop the job, so agree it with whoever owns the batch schedule.
- Rerun from the failed step once the cause is fixed. The owner of the program that issued the abend, the application team or the team that runs the sort product, is the one to fix it.
What it looks like
PAYBAL01 CONTROL TOTAL MISMATCH - INPUT 14,212 RECORDS, TRAILER 14,213 PAYBAL01 ENDING WITH USER ABEND 16 IEF450I PAYRUN01 STEP050 - ABEND=S000 U0016 REASON=00000000