Anda di halaman 1dari 27

CONTENIDO

Manejo de Errores con Begin Try/End Try Begin


Catch/End Catch
Uso de la variable @@Error
Lanzar Errores con la instruccin Raiserror

TRATAMIENTO DE ERORES
SQL Server proporciona el control de errores a
travs de las instrucciones TRY y CATCH.
Estas nuevas instrucciones suponen un gran paso
adelante en el control de errores en SQL Server.

TRATAMIENTO DE ERORES
Begin try

Expresion_sql
End try

Begin catch
Expresion_sql
End catch

TRATAMIENTO DE ERORES
Funciones especiales de Error
Las funciones especiales de error, estn disponibles
nicamente en el bloque CATCH para la obtencin de
informacin detallada del error.
A continuacin, presentamos las funciones que se utilizan
en el control de errores.

TRATAMIENTO DE ERORES
Funciones especiales de Error
ERROR_NUMBER(): Devuelve el numero de error
ERROR_SEVERITY(): Devuelve la severidad del error
ERROR_STATE(): Devuelve el estado del error
ERROR_PROCEDURE(): Devuelve el nombre del
procedimiento almacenado que ha provocado el error
ERROR_LINE(): Devuelve el nmero de lnea en la que
se ha producido el error.
ERROR_MESSAGE(): Devuelve el mensaje de error

TRATAMIENTO DE ERORES
Errores no afectados por una construccin
TRYCATCH
Las construcciones TRYCATCH no detectan lo siguiente:
o Advertencias o mensajes informativos que tienen una
gravedad 10 o inferior.
o Errores que tienen la gravedad 20 o superior que
detienen el procesamiento de las tareas de Motor de
base de datos de SQL Server en la sesin. Si se produce
un error con una gravedad 20 o superior y no se
interrumpe la conexin con la base de datos,
TRYCATCH controlar el error.

TRATAMIENTO DE ERORES
Errores no afectados por una construccin TRYCATCH
Las construcciones TRYCATCH no detectan lo siguiente:
o Atenciones, como solicitudes de interrupcin de clientes
o conexiones de cliente interrumpidas.
o Cuando el administrador del sistema finaliza la sesin
mediante la instruccin KILL.

TRATAMIENTO DE ERORES
Errores no afectados por una construccin TRYCATCH
Un bloque CATCH no controla los siguientes tipos de
errores cuando se producen en el mismo nivel de ejecucin
que la construccin TRYCATCH:
Errores de compilacin, como errores de sintaxis, que
impiden la ejecucin de un lote.
Errores que se producen durante la recompilacin de
instrucciones, como errores de resolucin de nombres de
objeto que se producen despus de la compilacin
debido a una resolucin de nombres diferida.

PROBLEMAS PRCTICOS

Manejo de Errores con TRYCATCH


--Problema N1
--sin capturar el error Qu sucede?
DECLARE @DIVISOR INT, @DIVIDENDO INT,
@RESULTADO INT
SET @DIVIDENDO = 5
SET @DIVISOR = 0
-- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR
0
SET @RESULTADO = @DIVIDENDO/@DIVISOR
--Resultado de la Ejecucin
Mens. 8134, Nivel 16, Estado 1, Lnea 6
Error de divisin entre cero.

Manejo de Errores con TRYCATCH


--Ahora capturando el error con Begin Try/End Try - Begin Catch/End
Catch
BEGIN TRY
DECLARE @DIVISOR INT, @DIVIDENDO INT, @RESULTADO INT
SET @DIVIDENDO = 5
SET @DIVISOR = 0
-- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0
SET @RESULTADO = @DIVIDENDO/@DIVISOR
PRINT 'NO HAY ERROR'
END TRY
BEGIN CATCH
PRINT 'SE HA PRODUCIDO UN ERROR'
END CATCH;
GO

--Resultado de la Ejecucin
SE HA PRODUCIDO UN ERROR

Manejo de Errores con TRYCATCH


BEGIN TRY
DECLARE @DIVISOR INT, @DIVIDENDO INT, @RESULTADO INT
SET @DIVIDENDO = 100
SET @DIVISOR = 0
-- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0
SET @RESULTADO = @DIVIDENDO/@DIVISOR
PRINT 'NO HAY ERROR'
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
GO
--Resultado de la Ejecucin
ErrorNumber
ErrorSeverity
8134
16
1
NULL

ErrorState ErrorProcedure
8

ErrorLine ErrorMessage
Error de divisin entre cero.

Manejo de Errores con TRYCATCH


BEGIN TRY
DECLARE @DIVISOR INT, @DIVIDENDO INT, @RESULTADO INT
SET @DIVIDENDO = 9
SET @DIVISOR = 0
-- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0
SET @RESULTADO = @DIVIDENDO/@DIVISOR
PRINT 'NO HAY ERROR'
END TRY

BEGIN CATCH
PRINT ERROR_MESSAGE()
PRINT ERROR_STATE()
END CATCH;

--Resultado de la Ejecucin
Error de divisin entre cero.
1

TRATAMIENTO DE ERORES
Variable de sistema @@ERROR
Devuelve el nmero de error de la ltima
instruccin TRANSACT-SQL ejecutada; si la
variable devuelve 0, la TRANSACT-SQL anterior
no encontr errores.

TRATAMIENTO DE ERORES
Variable de sistema @@ERROR
La variable @@ERROR devuelve un nmero de error que
representa el error de la operacin. Si el error se encuentra
en la vista de catlogo sys.sysmessages, entonces
@@ERROR, contendr el valor de la columna
sys.sysmessages.error para dicho error. Puede ver el texto
asociado con el nmero de error @@ERROR en
sys.sysmessages.description

Manejo de Errores con @@Error


--Qu sucede con el manejo del error?
DELETE FROM TB_Proveedor
IF @@ERROR<>0
BEGIN
PRINT 'No se puede eliminar el Proveedor
indicado.'
END
--Resultado de la Ejecucin
Mens. 547, Nivel 16, Estado 0, Lnea 1
Instruccin DELETE en conflicto con la restriccin REFERENCE
"FK_TB_Producto_TB_Proveedor_Codigo_Proveedor". El conflicto ha aparecido en la base
de datos "DB_EmpresaXYZ", tabla "dbo.TB_Producto", column 'Codigo_Proveedor'.
Se termin la instruccin.
No se puede eliminar el Proveedor indicado.

Manejo de Errores con @@Error


BEGIN TRY
DELETE FROM TB_Proveedor
END TRY
BEGIN CATCH
declare @NERROR INT
SET @NERROR = @@ERROR
IF @NERROR=547
BEGIN
PRINT 'Proveedor con Registros enlazados.'
PRINT @NERROR
END
END CATCH

--Resultado de la Ejecucin
(0 filas afectadas)
Proveedor con Registros enlazados.
547

Manejo de Errores con @@Error


USE BD_ACADEMICA
GO
SELECT * FROM TB_ESTUDIANTES
BEGIN TRY
INSERT INTO TB_ESTUDIANTES (ID_Estudiante, Nombre_Estudiante, Apellido_Estudiante,
Direccion_Estudiante, Telefono_Fijo_Estudiante, Telefono_Movil_Estudiante,
Correo_Estudiante, Cod_Carrera )
VALUES (9025,'Carlos','Perez','barbarena','993-1616','66302678',
'josesolis@utp.ac.pa', 1001)
END TRY
BEGIN CATCH
declare @NERROR INT
SET @NERROR = @@ERROR
IF @NERROR<>0
BEGIN
PRINT 'Ya existe un registro de estudiantes con esos datos.'
PRINT @NERROR
END
END CATCH

--Resultado de la Ejecucin
(0 filas afectadas)
Ya existe un registro de estudiantes con esos datos.
2627

Manejo de Errores con @@Error


USE DB_EmpresaXYZ
GO
BEGIN TRY
DELETE FROM TB_Producto --WHERE Cantidad_Inventario < 20
END TRY
BEGIN CATCH
DECLARE @MENSAJE VARCHAR(255)
DECLARE @ErrorNum int
--Recuperar la Descripcin del error
SELECT @MENSAJE= M.description, @ErrorNum = M.error FROM
SYS.sysmessages M
WHERE M.error=@@ERROR and msglangid = 3082
PRINT @MENSAJE
PRINT @ErrorNum
END CATCH
--Resultado de la Ejecucin
(0 filas afectadas)
Instruccin %1! en conflicto con la restriccin %2! "%3!". El conflicto ha aparecido en la base de
datos "%4!", tabla "%5!"%6!%7!%8!.
547

TRATAMIENTO DE ERORES
Generar un error RAISERROR
En ocasiones, es necesario provocar voluntariamente un
error, por ejemplo nos puede interesar que se genere un
error cuando los datos incumplen una regla de negocio.
Podemos provocar un error en tiempo de ejecucin a travs
de la funcin RAISERROR.
La funcin RAISERROR recibe tres parmetros, el mensaje
del error (o cdigo de error predefinido), la severidad y el
estado.

TRATAMIENTO DE ERORES
Generar un error RAISERROR
La severidad indica el grado de criticidad del error. Admite
valores de 0 al 25, pero solo podemos asignar valores del 0
al 18. Los errores el 20 al 25 son considerados fatales por
el sistema, y cerraran la conexin que ejecuta el comando
RAISERROR.
Para asignar valores del 19 al 25, necesitaremos ser
miembros de la funcin de SQL Server sysadmin.

Lanzar Mensaje de Error con RAISERROR


DECLARE @VALOR INT
SET @VALOR = 16
IF @VALOR = 15
BEGIN
RAISERROR('Un problema ha ocurrido al intentar
ejecutar la operacin
realizada', 16, 1 )
END
ELSE
BEGIN
RAISERROR('Sin error en la ejecucin', 3, 1 )
END

--Resultado de la Ejecucin
Sin error en la ejecucin
Mens. 50000, Nivel 3, Estado 1

Lanzar Mensaje de Error con RAISERROR


USE BD_ACADEMICA
GO
CREATE PROCEDURE PROC_RAISERROR_REGISTRO_ESTUDIANTE
@Id Int,
@Nombre varchar(20),
@Apellido varchar(20),
@Direccion varchar (20),
@Telefono varchar(10),
@Movil varchar(10),
@Correo varchar(50),
@Carrera int
AS
BEGIN
IF (@Nombre <> '' and @Apellido <> '')
BEGIN
INSERT INTO TB_ESTUDIANTES (ID_Estudiante, Nombre_Estudiante, Apellido_Estudiante, Direccion_Estudiante,
Telefono_Fijo_Estudiante, Telefono_Movil_Estudiante, Correo_Estudiante, Cod_Carrera )
VALUES(@Id, @Nombre, @Apellido, @Direccion, @Telefono, @Movil, @Correo, @Carrera)
END
ELSE
BEGIN
RAISERROR ('Se requiere por lo menos el nombre y apellido del Estudiante', 16,1)
END
END
GO
--LLamar procedimiento almacenado.
EXEC PROC_RAISERROR_REGISTRO_ESTUDIANTE 9026,'','','barbarena','993-1616','66302678',
'josesolis@utp.ac.pa', 1001
Go

--Resultado de la Ejecucin
Mens 50000, Nivel 16, Estado 1, Procedimiento PROC_RAISERROR_REGISTRO_ESTUDIANTE, Lnea 22
Se requiere por lo menos el nombre y apellido del Estudiante

PROBLEMAS PROPUESTOS

PROBLEMAS PROPUESTOS
/*
PROBLEMA PROPUESTO N1. Escribir el cdigo SQL que permita
verificar si existe el registro de un docente con los datos de
entrada. Si el registro exste con el nombre y el apellido, se
genere un error indicando que ya existe un registro del docente
utilizando la instruccin RAISERROR
*/

/*
Escriba el cdigo SQL para lanzar una advertencia cuando para un
curso especificado no hallan cupos disponibles segn una cantidad
establecida. Cuando la cantidad es por debajo del umbral igual se
indica con un mensaje que hay cupos disponible.
*/

FIN DE LA SESIN