Ambas formas funcionan, pero es más practica y segura (por si se omite validar alguna instruccion que provoque excepción) la que protege todo el bloque que es propenso a excepción.
---- Uso clásico con uso de marcadores y GOTO
Declare @Msj nvarchar(200)
--Comienza la transacción
BEGIN TRANSACTION
--UPDATE 1
--DELETE 1
--Insert 1
--para simular error
Select 1/0
--Verificar si hubo errores
IF @@Error != 0
GOTO ERROR_HANDLER
--Finalizar la Transacción
COMMIT TRANSACTION
print 'OK fin transacción'
SET NOCOUNT OFF
RETURN
--Manejador de Error.
ERROR_HANDLER:
ROLLBACK TRANSACTION
--Imprimir msj de error
set @Msj = 'Tenemos el error # ' + CONVERT(VARCHAR(10), Error_number()) + ' ' +
Error_message() + ' en la linea: ' + convert(varchar(10), ERROR_LINE())
RAISERROR 13000 @Msj
RETURN
-----Uso con Try-Catch de SQL Server 2005 o superior
Declare @Msj nvarchar(200)--Comienza la transacción
BEGIN TRANSACTION
BEGIN Try
--UPDATE 1
--DELETE 1
--Insert 1
--para simular error
Select 1/0
COMMIT TRANSACTION
END Try
BEGIN Catch
ROLLBACK TRANSACTION
--Imprimir msj de error
set @Msj = 'Tenemos el error # ' + CONVERT(VARCHAR(10), Error_number()) + ' ' +
Error_message() + ' en la linea: ' + convert(varchar(10), ERROR_LINE())
--PRINT @Msj
Raiserror 13000 @Msj
END Catch