관리 메뉴

안까먹을라고 쓰는 블로그

[MSSQL] 예외처리 (TRY, CATCH) 본문

DataBase/MS SQL

[MSSQL] 예외처리 (TRY, CATCH)

YawnsDuzin 2023. 10. 13. 11:14

 

반응형


Transact-SQL Visual C# 및 Microsoft Visual C++ 언어의 예외 처리와 유사한 방식으로 Microsoft에서 오류 처리를 구현합니다. Transact-SQL 문의 그룹을 TRY 블록으로 묶을 수 있으며 TRY 블록 내에서 오류가 발생하는 경우 일반적으로 CATCH 블록으로 묶은 또 다른 문의 그룹으로 제어가 전달됩니다.

TRY...CATCH 구문은 심각도가 10을 넘으며 데이터베이스 연결을 닫지 않는 모든 실행 오류를 catch합니다.

TRY 블록 다음에는 곧바로 연결된 CATCH 블록이 이어져야 합니다. END TRY와 BEGIN CATCH 문 사이에 다른 문을 포함시키면 구문 오류가 발생합니다.


Syntax
BEGIN TRY  
     { sql_statement | statement_block }  
END TRY  
BEGIN CATCH  
     [ { sql_statement | statement_block } ]  
END CATCH  
[ ; ]

 

Example
SET XACT_ABORT ON

BEGIN TRY
	BEGIN TRAN
    
    DECLARE @ERRMSG NVARCHAR(255)
    
    .... 처리할 부분
    
    END
    
	COMMIT TRAN
	RETURN
                                            
END TRY
BEGIN CATCH  
    SET @ERRMSG = ERROR_MESSAGE()      
    PRINT @ERRMSG
    
    IF (XACT_STATE()) = -1
    BEGIN
        ROLLBACK TRAN
    END
    ELSE IF (XACT_STATE() = 1 )
    BEGIN
        COMMIT TRAN
    END    
END CATCH

SET XACT_ABORT OFF

SET XACT_ABORT 옵션을 ON으로 설정하면 Transact-SQL 문에서 런타임 오류가 발생할 경우 
전체 트랜잭션이 종료된 후 롤백됩니다.

TRY...CATCH 구문은 심각도가 10을 넘으며 데이터베이스 연결을 닫지 않는 모든 실행 오류를 catch합니다.
TRY 블록 다음에는 곧바로 연결된 CATCH 블록이 이어져야 합니다. END TRY와 BEGIN CATCH 문 사이에 다른 문을 포함시키면 구문 오류가 발생합니다.

오류 메시지의 전체 텍스트를 반환합니다. 이 텍스트는 길이, 개체 이름 또는 시간과 같은 대체 가능한 매개 변수에 제공된 값을 포함합니다.
오류관련 확인 항목은 아래와 같습니다.

  1. ERROR_NUMBER()는 오류 번호를 반환합니다.
  2. ERROR_STATE()는 오류 상태 번호를 반환합니다.
  3. ERROR_PROCEDURE()는 오류가 발생한 저장 프로시저 또는 트리거의 이름을 반환합니다.
  4. ERROR_LINE()은 오류를 발생시킨 루틴 내의 줄 번호를 반환합니다.
  5. ERROR_MESSAGE()는 오류 메시지의 전체 텍스트를 반환합니다. 이 텍스트는 길이, 개체 이름 또는 시간과 같은 대체 가능한 매개 변수에 제공된 값을 포함합니다.
BEGIN TRY  
    -- Generate a divide-by-zero error.  
    SELECT 1/0;  
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

 

현재 실행 중인 요청의 사용자 트랜잭션 상태를 보고하는 스칼라 함수입니다. XACT_STATE는 요청에 활성 사용자 트랜잭션이 있는지 여부 및 트랜잭션이 커밋될 수 있는지 여부를 나타냅니다.

끝~

 

 

반응형
Comments