상세 컨텐츠

본문 제목

TRY... CATCH (에러처리)

청강컴정/DataBase

by luckey 2009. 3. 16. 20:37

본문

에러처리 관련 구문은 SQL2005버전부터 제공이 된다.

사용법
BEGIN TRY
    실행할 SQL 작업 구문들
END TRY
BEGIN CATCH
    에러 처리 작업 구문들
END CATCH

예를 들어 insert 작업을 하는도중에 에러가 발생했다고 가정하자, 구문에러일 수도 있고 여러형태의 에러가 있을수도 있겠다.
그럴경우 에러를 잡아내는 방법으로써, BEGIN TRY ~ END TRY 사이에 insert나 여러가지 형태의 SQL 구문들이 들어갈수 있겠다. 진행되는 도중에 에러가 발생하면 바로 BEGIN CATCH ~ END CATCH 문으로 이동하는 것이다.

SQL에서는 일반적을 데이터베이스 엔진 오류심각도 11부터 19까지의 에러를 포착하여 에러 처리문으로 처리할 수 있다고 한다.

10 이하의 에러는 일반적으로 시스템 오류 메시지를 발생시키지 않는 에러들이며, 20 이상의 에러들은 데이터베이스 인스턴스가 끊어지는등 에러메시지 조차 정상적으로 반환할 수 없는 심각한 오류들이다.

그래서 TRY... CATCH는 오류 심각도 11부터19까지의 에러를 관리한다.
오류심각도 11~16까지는 일반적인 사용자가 해결할 수 없는 오류를 표시한다
11 : 지정한 개체 또는ENTITY가 없음을 나타낸다.
12 : 특수한 쿼리 힌트로 인해 잠금을 사용하지 않는 쿼리에 대한 특수 심각도 이다.
13 : Transaction 교착 상태 오류
14 : Transact-SQL 명려의 구문오류
15 : 사용자가 해결할 수 있는 일반오류

오류심각도 17 ~ 19까지는 사용자가 해결할 수 없는 소프트웨어 오류를 나타내며 문제를 시스템관리자에게 알려야 한다. 

자세한 내용은 http://msdn.microsoft.com/ko-kr/library/ms164086(SQL.90).aspx 참고하자.

오류함수
TRY... CATCH 에서는 다음 오류 함수를 사용하여 오류 정보를 캡쳐합니다.
* ERROR_NUMBER() : 오류번호를 반환한다.
* ERROR_MESSAGE() : 오류메시지의 전체 텍스트를 반환한다. 
  이 텍스트는 길이, 개체 이름 또는 시간과 같은 대체 가능한 매개변수에 대해 제공된 값을 포함한다.
* ERROR_SEVERITY() : 오류 심각도를 반환한다.
* ERROR_STATE() : 오류 상태번호를 반환한다.
* ERROR_LINE() : 오류를 발생시킨 루틴 내의 줄 번호를 반환한다.
* ERROR_PROCEDURE() : 오류가 발생한 저장 프로시져 또는 트리거의 이름을 반환한다.

위의 오류함수들은 반드시 catch 문 안에서 사용하여야 하며 catch 문 밖에서 사용할 경우 항상 NULL 값을 반환한다.

** 주의사항 **
- 위에서 보듯이 TRY와 CATCH 문은 어뜻보면 두개의 구문으로 보이지만 사실 하나의 구문이기때문에 TRY와 CATCH사이에
는 어떠한 다른 구문도 작성해서는 안된다. 구문 작성시 구문에러가 발생된다.
BEGIN TRY
....
END TRY
               <----여기에 아무것도 작성하면 안된다.
BEGIN CATCH
.....
END CATCH

- 여러개의 TRY... CATCH문은 중첩이 가능하지만 자동으로 Rollback 해주는 기능은 제공하지 않는다.

- 에러가 발새외어서 CATCH 블록이 실행되었다고 해서 process가 종료되지 않는다.
   만약 process를 종료하고 싶다면 CATCH문안에 RETURN문을 작성해 주어야 한다.

- TRY... CATCH구문을 사용하면서 CATCH구문에 에러메시지 반환을 위한 어떤 아무런 조치도 해주지 않는다면 SQL은 사용자 또는 Application program에게 어떠한 에러메시지도 반환하지 않는다.

!! 반드시 TRY... CATCH문을 사용할때는 RETURN값을 다르게 해주던가, 에러메시지를 반환하도록 programming 해주어야 한다.


관련글 더보기

댓글 영역