It is true there is nothing built into the primitive batch language that even comes close to exception handling. Never-the-less, there is a surprisingly sophisticated and robust implementation of batch exception handling posted at
http://www.dostips.com/forum/viewtopic.php?f=3&t=6497, and it uses nothing but pure, native batch :-)
The technique allows definition of TRY/CATCH blocks with the following form:
:someRoutine
setlocal
%@Try%
REM Normal code goes here
%@EndTry%
:@Catch
REM Exception handling code goes here
:@EndCatch
And exceptions can be thrown with
call exception throw -156 "Exception message" "LocationString"
Exceptions bubble up until Try/Catch is detected, whereupon the exception is either handled completely and processing continues, or else an exception is rethrown and it continues to bubble up, possibly all the way to the command line context where batch processing is terminated.
Follow the link near the top for full code, example usage, and explanation.