Error handling in nested stored procedures

I have a problem with my error handling in nested stored procedures (SQL Server 2000).

Below is an example of stored procedures that are causing this problem. If you install the scripts and run sp1, you'll get 2 errors:
(1) Divide by zero error encountered. -- This is expected due to : select 1/0
(2) Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.

This 2nd error is the problem and I'm not sure what is it.

If I change "select 1/0" to "insert into TestTable(Col1) values ('hello')", where Col1 is an int, I get : Syntax error converting the varchar value 'hello' to a column of data type

int. BUT I don't get that 2nd error about the COMMIT or ROLLBACK TRANSACTION statement missing. For this different error, my error handling works perfectly.

Does anyone know what is causing this problem, and how I should change my error handling to avoid it.

I prefer point of view N°2 of this articles that put multi level transaction.
I add my own handling system with using Mix of point of view N°1 (allowing using transaction) save point (SAVE TRAN @SavePoint)
Where @SavePoint is char(36) GUID.

So with such solution you could ensure (what ever upper call makes) that your SP have made a rollback using ROLLBACK TRAN @SavePoint

Remember that with this solution local rollback has been ensure but the overall rollback depend only of callers proper error handling.