본문 바로가기
DATABASE/MsSQL

[MsSQL] Exception / Try ~ Catch 문 기초

by DANEW 2023. 7. 18.

Intro

안녕하세요

초보 DBA 다뉴입니다.

 

오늘은 MsSQL의 Exception 처리를 위해 사용하는

Try~Catch Block에 대해서 한번 알아보도록 하겠습니다.

 

구문의 에러가가 발생하였을 때 에러에 대한 예외처리를 하는 것인데요.

 

T-SQL이 실행 중 에러가 발생할 경우 심각도에 따라 바로 종료가 되거나, 트랜젝션에 문제가 발생 할 수 있습니다.

이러한 경우를 예외처리를 통하여 방지하는 역할을 합니다.


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 catch ~ end catch로 감싸야 한다.
  • Try 블록에 오류 발생시 실행할 명령문을 넣는다.
  • 오류가 발생하면 즉시 Catch 블록을 실행한다.
  • end catch 도달시 end catch문 뒤에 명령문을 실행한다.
  • catch 블록에 의해 트랩 된 오류는 응용프로그램으로 리턴되지 않는다.

Finally

  • MsSQL에는 없다.
  • Try, Catch 블록이 끝나면 end catch뒤에 명령어를 실행하기때문에 사실상 Finally

추가 사항

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

begin try
	insert into #TB_Test values(1, 2/1, '정상 실행')
	insert into #TB_Test values(2, 2/0, '0으로 나눈다')
end try
begin catch
	select 'ERROR_NUMBER() ',   cast(ERROR_NUMBER()    as varchar(100))   union all
	select 'ERROR_SEVERITY()',  cast(ERROR_SEVERITY()  as varchar(100))   union all
	select 'ERROR_STATE()',     cast(ERROR_STATE()     as varchar(100))   union all
	select 'ERROR_PROCEDURE()', cast(ERROR_PROCEDURE() as varchar(100))   union all
	select 'ERROR_LINE()',      cast(ERROR_LINE()      as varchar(100))   union all
	select 'ERROR_MESSAGE()',   cast(ERROR_MESSAGE()   as varchar(100))

	select * from #TB_Test
end catch

try~catch 테스트 및 catch블록 함수


Outro

Try ~ Catch문에 대한 기초에 대해 알아보았습니다.

 

해당 구문을 begin tran과 함께 사용하여

트랜젝션의 무결성을 유지하는 데에 사용하거나, 특정 상황에서 오류를 발생 시키는 등의

좀더 업무적으로 사용할 수 있는 방법들이 있는데요.

 

해당 내용에 대해서는 다음 포스팅에 알아보도록 하겠습니다!

 

감사합니다.

 

반응형