Well, your example works for me, too.
I tried adding a few more features, and it still works.
My original code was inside a moderately complex SP, and on return from the
SP the @@trancount was 1. This was repeatable.
But I put your code, and several variations, inside of an SP, and it comes
back zero. So I dunno. At least I was not completely crazy to put the begin
tran before the begin try! I guess all I can say is watch out.