• After all these years, I've found a palatable solution. The design pattern involves these steps:

    1. Create and start an Extended Events Session: it will capture sqlserver.error_reported events, filtered primarily by SPID.

    2. Execute a statement in a TRY block.

    3. Within (or after) the CATCH block, read the XEvents session data.

    4. Use the available data to respond to the error(s) as appropriate.

    5. Stop and drop the XEvents session.

    More details in my blog articles:

    The Unfulfilled Promise of TRY...CATCH

    Enhanced T-SQL Error Handling With Extended Events

    Part 2: Enhanced T-SQL Error Handling With Extended Events

    (BTW, since this is an old post in a SQL 2005 forum, it should be noted that XEvents didn't exist in SQL 2005)