Computer/DB

[DB/MSSQL] Try ~ Catch - Transaction,Throw

에린_1 2025. 2. 26. 12:30
728x90

TRY, CATCH, FINALLY

BEGIN TRY
-- 실행할 명령문
END TRY

BEGIN CATCH
-- 예외처리 명령문
END CATCH

TRY

  • BEGIN TRY ~ END TRY로 감싸야 한다.
  • 오류가 발생할 가능성이 있는 실행할 명령문을 넣는다.
  • 오류 없이 실행이 END TRY 도달 시 CATCH를 생략하며, END CATCH문 뒤에 명령문을 실행한다.

CATCH

  • END TRY 뒤에 바로 와야한다.
  • BEGIN TRY ~ END CATCH로 감싸야 한다.
  • TRY 블록에 오류 발생시 실행할 명령문을 넣는다.
  • 오류가 발생하면 즉시 CATCH 블록을 실행한다.
  • END CATCH 도달 시, END CATCH문 뒤에 명령문을 실행한다.
  • CATCH 블록에 의해 트랩된 오류는 응용 프로그램으로 리턴되지 않는다.

추가 사항

  • 데이터베이스 연결이 종료되지 않는 심각도가 10 이상인 모든 실행 오류를 캐치한다.
    • 심각하지 않은 오류, 심각도 10 이하에 대해서는 캐치하지 않는다.
    • 연결이 종료되면 실행이 종료되기 때문에 일반적으로 심각도 20~25의 데이터베이스 연결을 종료하는 오류는 CATCH 블록에서 처리되지 않는다.
  • TRY ~ CATCH는 중첩이 가능하다.
  • CATCH 블록에서 실행 가능한 함수
    • ERROR_NUMBER(): 오류 번호를 반환한다.
    • ERROR_SEVERITY(): 오류 심각도를 반환한다.
    • ERROR_STATE(): 오류 상태 번호를 반환한다.
    • ERROR_PROCEDURE(): 오류가 발생한 저장 프로시저 또는 트리거의 이름을 반환한다.
    • ERROR_LINE(): 오류를 일으킨 루틴 내부의 행 번호를 리턴한다.
    • ERROR_MESSAGE(): 오류 메시지의 전체 텍스트를 반환한다. 텍스트에는 길이, 오브젝트 이름 또는 시간과 같은 대체 가능한 매개 변수에 제공된 값이 들어 있다.

Transaction 제어

BEGIN TRAN을 사용한 COMMIT/ROLLBACK

BEGIN TRY
	BEGIN TRAN
		-- 실행할 TRANSACTION
		-- 오류가 없다면 COMMIT
		COMMIT TRAN
END TRY

BEGIN CATCH
	-- 오류 발생 시 ROLLBACK
	ROLLBACK TRAN
END CATCH
  • TRY 블록에 오류가 없을 경우 COMMIT TRAN 까지 동작 후 CATCH를 건너뛴다.
  • TRY 블록에 오류가 있을 경우 CATCH 블록으로 이동하여 ROLLBACK TRAN이 실행된다.
  • 여러 COMMIT을 통해 일정부분까지 반영 하도록 할 수 있다.
  • 에러가 나기전 COMMIT까지 COMMIT이 완료되며, 에러 난 후로는 롤백이 된다.

Throw - 예외 발생시키기

Throw

  • Throw는 쿼리문에서 사용자가 직접 예외를 발생시킬 수 있게 해준다.
THROW error_number, message, state
  • error_number
    • 예외를 나타내는 상수 혹은 변수이다.
    • int형이며 50000이상 2147483647 이하의 수여야 한다.
  • message
    • 예외를 설명하는 문자열 or 변수이다.
    • nvarchar형이며 길이는 2048이다.
  • state
    • 메시지와 연결할 상태를 나타내는 상수 or 변수이다.
    • tinyint형이며 0~255 사이 이다.
  • THROW문 앞의 문은 세미콜론(;)으로 끝나야한다.
  • TRY~CATCH 문을 사용할 수 없으면 명령문 일괄 처리가 종료되며, 예외가 발생한 줄 번호와 프로시저가 설정된다.
  • 심각도는 16으로 설정된다.
  • 매개 변수 없이 지정된 THROW문은 CATCH블록 안에 있어야 한다. 이 경우 예외가 발생한다.
  • MESSAGE의 텍스트에 %는 예약문자로 사용하기 위해서 %%로 사용해야 한다.

참조

https://da-new.tistory.com/94

 

[MsSQL] Exception / Try~Catch 문 활용 -Transaction, Throw

Intro 안녕하세요 초보 DBA 다뉴입니다. 저번포스팅 Exception / Try ~ Catch문 기초에 이어서 활용하는 방법에 대해서 한번 알아보려고 하는데요. 기초에 대해 정리한 글이 궁금하신분은 아래의 글을 참

da-new.tistory.com

 

[MsSQL] Exception / Throw 사용 시 주의 사항 - rollback

 

[MsSQL] Exception / Throw 사용 시 주의 사항 - rollback

Intro 안녕하세요. 초보 DBA입니다. 얼마전 쿼리 검수를 하다가 발견한 잘못 작성된 SQL 문인데요. 논리적으로 생각해보니 이상해 보여서 테스트를 한번 진행하고 해당 내용을 남겨볼까합니다. Throw

da-new.tistory.com

 

728x90