I think you want to use a transaction save point:
[font="Courier New"]Create Table #BPTest(id int)
begin try
begin tran OuterTran
Insert into #BPTest values (1)
begin try
save tran InnerTran
Insert into #BPTest values (2)
Declare @Error varchar(500)
set @Error='test'
RAISERROR(@Error, 16, -1)
end try
begin catch
rollback tran InnerTran
end catch
Insert into #BPTest values (3)
end try
begin catch
print Error_Message()
rollback tran OuterTran
end catch
Select * from #BPTest
drop table #BPTest [/font]