We can handle error in SQL Server using below 3 methods,
Error / Exception -
	System defined
	User Defined 
1)	Try Catch Block
2)	RaisError()
3)	Throw()
Try Catch Block
begin Try
	Select 1/0
End Try
begin catch
	print Error_message()
	--log
End catch
A group of T-SQL statements can be enclosed in TRY block. 
If an error occurs in the TRY block, 
control is passed to CATCH block (group of SQL statements that is enclosed)
In the scope of a CATCH block, 
the below system functions can be used to obtain information about the error,
ERROR_NUMBER(): Returns the Error Number.
ERROR_SEVERITY(): Returns the Severity of the Error.
ERROR_STATE(): Returns the State of the Error.
ERROR_PROCEDURE(): Returns the name of the SP/UDF in which the error occurred.
ERROR_LINE(): Returns the line number of the SQL statement that raised the error.
ERROR_MESSAGE(): Returns the error message.
Select * from SYS.Messages
1. ERROR NUMBER
Any error number <= 50000 is a System Defined Message and the ones that are > 50000 are User Defined Messages. 
SYS.Messages catalog view can be used to retrieve both System and User Defined Messages. 
We can add a user defined message using sp_addmessage and we can remove it using the system stored procedure sp_dropmessage. 
2. ERROR SEVERITY
Error Severity can be between 0-25.
	0-10: Informational or a warning.
	11-16: Programming Errors.
	17-25: Resource / Hardware / OS/ SQL Server Internal Errors.
	20-25: Terminates the Connection.
	19-25: Only User with SysAdmin rights can raise errors with this severity.
3. ERROR STATE
The same error can be raised for several different conditions in the code. 
Each specific condition that raises the error assigns a unique state code. 
Also the SQL Support team uses it to find the location in the source code where that error is being raised.
4. ERROR PROCEDURE
The name of the Stored Procedure or the function in which the error occurred. It will be blank if it is a normal batch of statements.
5. ERROR LINE
Line number of the statement within a SP, function or Batch that triggered the error. 
6. ERROR MESSAGE
Error description detailing the reason for the error.
--------------------------
Log the Error and write error into Errorlog Table.
Errorlog Table Defination:
Drop Table if Exists [dbo].[ErrorLogHandle] 
CREATE TABLE [dbo].[ErrorLogHandle](
	[Id] [bigint] IDENTITY(1,1) PRIMARY Key,
	[ErrorNumber] [bigint] NULL,
	[ErrorLine] [int] NULL,
	[ErrorProcedure] [nvarchar](100) NULL,
	[ErrorMessage] [nvarchar](max) NOT NULL,
	[ErrorDateTime] [datetime] NOT NULL,
 )
--1)	Handle Error in stored procedure
Select * from [dbo].[ErrorLogHandle]
create procedure [dbo].[Proc_ExceptionHandle]
AS
BEGIN
		BEGIN TRY 
				Print 'Hi'
				Select 15/0 As Result;
		END TRY 
		BEGIN CATCH  	
		INSERT INTO [dbo].[ErrorLogHandle]
		([ErrorNumber],[ErrorLine],[ErrorProcedure],[ErrorMessage],[ErrorDateTime])
		SELECT   ERROR_NUMBER()	   AS ErrorNumber,			 
				 ERROR_LINE()      AS ErrorLine, 
				 ERROR_PROCEDURE() AS ErrorProcedure, 
				 ERROR_MESSAGE()   AS ErrorMessage,
				 GETDATE()	       AS ErrorDateTime
		END CATCH 
END
Exec [dbo].[Proc_ExceptionHandle]
output  
Result 
------------
here we can check error in logged in ErrorLogHandle Table.
Select * from ErrorLogHandle
Raiserror method
Raise user defined exception.
RaisError(msg_str/msg_id, severity, state)
If a msg_id is passed to RAISERROR, the ID must be defined in sys.messages.
The msg_str parameter can contain printf formatting styles.
The severity parameter specifies the severity of the exception.
Create procedure [dbo].[Proc_Raiseerror]
AS
BEGIN
		BEGIN TRY 
				Declare @yearlyPackage Int
				Set @yearlyPackage=200000 
				Declare @MonthlySalary Decimal(8,3)
				Set @MonthlySalary=(@yearlyPackage/12);
				Select @MonthlySalary
				if (@MonthlySalary<=25000)
				BEGIN
					RaisError('Salary Should be greater than 25000',16,1);
				END
				Select 'My statement' as Stmt
		END TRY 
		BEGIN CATCH  
			INSERT INTO [dbo].[ErrorLogHandle]
			([ErrorNumber],[ErrorLine],[ErrorProcedure],[ErrorMessage],[ErrorDateTime])
			SELECT   ERROR_NUMBER()	   AS ErrorNumber,			 
					 ERROR_LINE()      AS ErrorLine, 
					 ERROR_PROCEDURE() AS ErrorProcedure, 
					 ERROR_MESSAGE()   AS ErrorMessage,
					 GETDATE()	       AS ErrorDateTime
		---in catch block we can use RAISERROR
		END CATCH 
END
exec dbo.Proc_Raiseerror
Select * from ErrorLogHandle
Throw method
Raises an exception 
Arguments:
1) error_number
Is a constant or variable that represents the exception. 
error_number is int and must be greater than or equal to 50000 and less than or equal to 2147483647.
2) message
Is an string / variable that describes the exception. 
message is nvarchar(2048).
3) state
Is a constant / variable between 0 and 255 that indicates the state to associate with the message. state is tinyint.
The statement before the THROW statement must be followed by the semicolon (;) statement terminator.
	BEGIN Try
	Declare @yearlyPackage Int
	Set @yearlyPackage=200000  
	Declare @MonthlySalay Decimal(8,3)
	Set @MonthlySalay=(@yearlyPackage/12);
	Select @MonthlySalay
	IF @MonthlySalay<25000
	BEGIN
	;THROW 50000,'Salary Should be greater than 25000', 1;
	END
	Select 'Hello'
	End try
	Begin catch
		INSERT INTO [dbo].[ErrorLogHandle]
			([ErrorNumber],[ErrorLine],[ErrorProcedure],[ErrorMessage],[ErrorDateTime])
			SELECT   ERROR_NUMBER()	   AS ErrorNumber,			 
					 ERROR_LINE()      AS ErrorLine, 
					 ERROR_PROCEDURE() AS ErrorProcedure, 
					 ERROR_MESSAGE()   AS ErrorMessage,
					 GETDATE()	       AS ErrorDateTime
	end catch
	Select * from ErrorLogHandle
Comments
Post a Comment
If you have any doubt then please let me know in comment section.