<p>I have encapsulated a backup database command in a Try/Catch and it appears that the error message is being lost somewhere.  For example:</p>

<pre><code>BACKUP DATABASE NonExistantDB TO DISK = 'C:\TEMP\NonExistantDB.bak'
</code></pre>

<p>..gives error:<br>
<strong><em>Could not locate entry in sysdatabases for database 'NonExistantDB'. No entry found with that name. Make sure that the name is entered correctly. BACKUP DATABASE is terminating abnormally.</em></strong></p>

<p>Whereas:</p>

<pre><code>BEGIN TRY
    BACKUP DATABASE NonExistantDB TO DISK = 'C:\TEMP\NonExistantDB.bak'
END TRY
BEGIN CATCH
    PRINT ERROR_MESSAGE()
END CATCH
</code></pre>

<p>... only gives error:  <strong><em>BACKUP DATABASE is terminating abnormally.</em></strong></p>

<p>Is there a way to get the full error message or is this a limitation of try/catch?</p>

It's a limitation of try/catch.
If you look carefully at the error generated by executing
```
```
BACKUP DATABASE NonExistantDB TO DISK = 'C:\TEMP\NonExistantDB.bak'
```
```
you'll find that there are two errors that get thrown. The first is msg 911, which states
Could not locate entry in sysdatabases for database 'NonExistantDB'. No entry
  found with that name. Make sure that the name is entered correctly.
The second is the 3013 message that you are displaying. Basically, SQL is only returning the last error.