By default the return code of a <exec> is ignored; when you set failonerror="true" then any non zero response is treated as an error. Alternatively, you can set resultproperty to the name of a property and have it assigned to the result code (barring immutability, of course).
If the attempt to start the program fails with an OS dependent error code, then <exec> halts the build unless failifexecutionfails is set. You can use that to run a program if it exists, but otherwise do nothing.
What do those error codes mean? Well, they are OS dependent. On
Windows boxes you have to look in include
error.h in your windows
compiler or wine files; error code 2 means 'no such program', which
usually means it is not on the path. Any time you see such an error
from any ant task, it is usually not an ant bug, but some
configuration problem on your machine.