수색…


비고

TRY / CATCH는 MS SQL Server의 T-SQL에 특정한 언어 구조입니다.

.NET 코드에서와 비슷한 T-SQL 내에서 오류 처리가 가능합니다.

TRY / CATCH의 거래

유효하지 않은 datetime으로 인해 두 삽입을 롤백합니다.

BEGIN TRANSACTION
BEGIN TRY
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, GETDATE(), 1)
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, 'not a date', 1)
    COMMIT TRANSACTION
END TRY
BEGIN CATCH        
    ROLLBACK TRANSACTION -- First Rollback and then throw.
    THROW
END CATCH

이렇게하면 두 삽입을 커밋합니다.

BEGIN TRANSACTION
BEGIN TRY
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, GETDATE(), 1)
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, GETDATE(), 1)
    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    THROW
    ROLLBACK TRANSACTION
END CATCH

try-catch 블록에서 오류 발생

RAISERROR 함수는 TRY CATCH 블록에서 오류를 생성합니다.

DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
    print 'First statement';
    RAISERROR(@msg, 11, 1);
    print 'Second statement';
END TRY
BEGIN CATCH
    print 'Error: ' + ERROR_MESSAGE();
END CATCH

두 번째 매개 변수가 10보다 큰 RAISERROR (이 예제에서는 11)는 TRY BLOCK에서 실행을 중지하고 CATCH 블록에서 처리 할 오류를 발생시킵니다. ERROR_MESSAGE () 함수를 사용하여 오류 메시지에 액세스 할 수 있습니다. 이 샘플의 출력은 다음과 같습니다.

First statement
Error: Here is a problem!

try catch 블록에서 정보 메시지를 발생시킵니다.

심각도 (두 번째 매개 변수)가 10 이하인 RAISERROR는 예외를 throw하지 않습니다.

BEGIN TRY
    print 'First statement';
    RAISERROR( 'Here is a problem!', 10, 15);
    print 'Second statement';
END TRY
BEGIN CATCH    
    print 'Error: ' + ERROR_MESSAGE();
END CATCH

RAISERROR 문 다음에 세 번째 문이 실행되고 CATCH 블록이 호출되지 않습니다. 실행 결과 :

First statement
Here is a problem!
Second statement

RAISERROR에 의해 생성 된 재실행 예외

TRHOW 문을 사용하여 CATCH 블록에서 catch하는 오류를 다시 throw 할 수 있습니다.

DECLARE @msg nvarchar(50) = 'Here is a problem! Area: ''%s'' Line:''%i'''
BEGIN TRY
    print 'First statement';
    RAISERROR(@msg, 11, 1, 'TRY BLOCK', 2);
    print 'Second statement';
END TRY
BEGIN CATCH
    print 'Error: ' + ERROR_MESSAGE();
    THROW;
END CATCH

이 경우 형식화 된 인수 (네 번째 및 다섯 번째 매개 변수)로 오류가 발생합니다. 메시지에 정보를 추가하려는 경우 유용 할 수 있습니다. 실행 결과 :

First statement
Error: Here is a problem! Area: 'TRY BLOCK' Line:'2'
Msg 50000, Level 11, State 1, Line 26
Here is a problem! Area: 'TRY BLOCK' Line:'2'

TRY / CATCH 블록에서 예외 예외 발생

try catch 블록에서 예외를 throw 할 수 있습니다.

DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
    print 'First statement';
    THROW 51000, @msg, 15;
    print 'Second statement';
END TRY
BEGIN CATCH
    print 'Error: ' + ERROR_MESSAGE();
    THROW;
END CATCH

예외는 CATCH 블록에서 처리 된 다음 매개 변수없이 THROW를 사용하여 다시 throw됩니다.

First statement
Error: Here is a problem!
Msg 51000, Level 16, State 15, Line 39
Here is a problem!

쓰로는 RAISERROR와 비슷하지만 다음과 같은 차이점이 있습니다.

  • 권장 사항은 새로운 응용 프로그램이 RASIERROR 대신 THROW를 사용해야한다는 것입니다.
  • THROW는 첫 번째 인수 (오류 번호)로 숫자를 사용할 수 있으며 RAISERROR는 sys.messages 뷰에서 ID 만 사용할 수 있습니다.
  • 쓰루 (심각도 16) (변경할 수 없음)
  • THROW는 RAISERROR와 같은 인수를 형식 지정할 수 없습니다. 이 기능이 필요한 경우 RAISERROR의 인수로 FORMATMESSAGE 함수를 사용하십시오.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow