MSSQL - 예외처리 (TRY-CATCH)

반응형

 

예외처리란? (TRY-CATCH)

  • 프로그래밍 언어의 예외 처리와 유사한 방식으로 오류를 처리하는 것

수행 절차

  • 1. SQL문을 TRY 구문에 작성
  • 2. TRY 구문 수행
  • 3. 오류 발생시 CATCH 구문 수행
  • 4. 오류가 없을 경우 CATCH 이후 구문 수행

CATCH 발생 조건

  • 심각도가 10을 넘는 경우
  • 데이터베이스 연결을 닫지 않은 모든 실행 오류인 경우

구문

  • TRY : 수행 할 쿼리 작성
    • 단독 사용 불가
    • 반드시 CATCH 구문으로 이어져야 함
    • BEGIN TRY로 시작해서 END TRY로 종료
  • CATCH : 오류 발생시 수행할 쿼리 작성
    • 단독 사용 불가
    • END TRY 구문 이후에 작성
    • END CATCH로 시작해서 END CATCH로 종료
  • TRY구문과 CATCH구문 사이에 다른 쿼리가 포함 될 경우 구문 오류 발생
BEGIN TRY
     -- 수행 할 쿼리 작성
END TRY
BEGIN CATCH  
     -- 오류 발생시 수행 할 쿼리 작성
END CATCH

오류 세부 확인

  • CATCH 구문에서 시스템 함수를 사용하여 오류에 대한 상세 정보를 확인
    • ERROR_NUMBER() : 오류 번호 반환
    • ERROR_SEVERITY() : 심각도 반환
    • ERROR_STATE() : 오류 상태 번호 반환
    • ERROR_PROCEDURE() : 오류가 발생한 저장 프로시저 또는 트리거의 이름 반환
    • ERROR_LINE() : 오류를 발생시킨 줄 번호 반환
    • ERROR_MESSAGE() : 오류 메시지의 내용을 반환

사용 예시

오류가 없는 구문 수행

  • 오류가 없는 경우 END CATCH 이후 명령 수행
-- TRY 구문
BEGIN TRY
	DECLARE @PICACHU NVARCHAR(10)
	SET @PICACHU = '백만볼트'
END TRY
-- CATCH 구문
BEGIN CATCH
	RAISERROR('데이터타입이 맞지 않습니다.',10, 1)
END CATCH

PRINT('피카츄 공격!')
PRINT(@PICACHU)


오류가 있는 구문 수행

  • 오류 발생시 CATCH 구문 수행
  • CATCH 구문 수행 후 이후 명령 수행
-- TRY 구문
BEGIN TRY
	DECLARE @PICACHU INT
	SET @PICACHU = '백만볼트'
END TRY
-- CATCH 구문
BEGIN CATCH
	RAISERROR('데이터타입이 맞지 않습니다.',10, 1)
END CATCH

PRINT('피카츄 공격!')
PRINT(@PICACHU)


오류 발생시 수행 중단하기

  • 위의 예시를 보면 CAT구문의 오류를 수행하고 나서도 이후의 구문을 수행
  • 심각도가 10을 넘어야만 오류 발생시 실행 쿼리문 중단 가능
  • 자세한 것은 RAISERROR, 심각도에 대한 포스팅을 확인해주세요.
 

MSSQL - RAISERROR (오류 메시지 생성하기)

RAISERROR 오류 메시지를 생성하고 세션에 대한 오류 처리를 시작 사용자 정의 메시지를 참조하거나 동적으로 메시지를 작성 오류 메시지 반환 호출하는 애플리케이션 새 애플리케이션에서는 THROW

luvris2.tistory.com

 

-- TRY 구문
BEGIN TRY
	DECLARE @PICACHU INT
	SET @PICACHU = '백만볼트'
END TRY
-- CATCH 구문
BEGIN CATCH
	RAISERROR('데이터타입이 맞지 않습니다.',11, 1) -- 심각도 11로 변경
END CATCH

PRINT('피카츄 공격!')
PRINT(@PICACHU)


오류가 있는 구문 수행시 오류 상세 보기

-- TRY 구문
BEGIN TRY
	DECLARE @PICACHU INT
	SET @PICACHU = '백만볼트'
END TRY
-- CATCH 구문
BEGIN CATCH
	RAISERROR('데이터타입이 맞지 않습니다.',11, 1)
        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

PRINT('피카츄 공격!')
PRINT(@PICACHU)

반응형