구조적 예외 처리 구현

완료됨

이제 T-SQL에서 오류 및 기본 오류 처리의 특성을 이해했으므로 이제 더 고급 형식의 오류 처리를 살펴보겠습니다. 구조적 예외 처리는 SQL Server 2005에서 도입되었습니다.

여기서는 TRY CATCH 블록, 오류 처리 함수의 역할, 잡을 수 있는 오류와 잡을 수 없는 오류의 차이를 이해하는 것을 포함하여 이를 사용하고 해당 이점과 제한 사항을 평가하는 방법을 알아보세요. 마지막으로, 필요한 경우 오류를 관리하고 표시할 수 있는 방법을 확인할 수 있습니다.

TRY/CATCH 블록 프로그래밍이란?

구조적 예외 처리는 @@ERROR 시스템 변수를 기반으로 하는 오류 처리보다 더 강력합니다. 이를 통해 코드가 오류 처리 코드로 산재하지 않도록 방지하고 해당 오류 처리 코드를 중앙 집중화할 수 있습니다. 오류 처리 코드의 중앙 집중화는 포함된 오류 처리보다는 코드의 목적에 더 집중할 수 있습니다.

TRY 블록 및 CATCH 블록

구조적 예외 처리를 사용하는 경우 오류를 발생시키는 코드는 TRY 블록 내에 배치됩니다. TRY 블록은 BEGIN TRYEND TRY 문으로 묶습니다.

catch 가능한 오류가 발생하는 경우 - 대부분의 오류는 catch 가능하며 실행 제어는 CATCH 블록으로 이동합니다. CATCH 블록은 BEGIN CATCHEND CATCH 문으로 묶인 일련의 T-SQL 문입니다.

비고

BEGIN CATCH 및 END TRY는 별도의 문이지만 BEGIN CATCH는 END TRY 바로 뒤에 와야 합니다.

현재 제한 사항

상위 수준 언어는 종종 try/catch/finally 구문을 제공하며 리소스를 암시적으로 해제하는 데 사용되는 경우가 많습니다. T-SQL에는 동등한 FINALLY 블록이 없습니다.

catch할 수 있는 오류와 catch할 수 없는 오류의 차이점 이해

TRY/CATCH 블록을 사용하면 @@ERROR 사용할 수 있는 것보다 훨씬 광범위한 오류를 catch할 수 있지만 모든 형식을 catch할 수는 없다는 것을 깨닫는 것이 중요합니다.

잡을 수 있는 오류와 잡을 수 없는 오류

TRY/CATCH 블록이 있는 동일한 범위 내에서 TRY/CATCH 블록이 모든 오류를 잡을 수 있는 것은 아닙니다. 종종 동일한 범위에서 포착할 수 없는 오류는 주변 범위에서 포착될 수 있습니다. 예를 들어 TRY/CATCH 블록이 포함된 저장 프로시저 내에서 오류를 catch하지 못할 수 있습니다. 그러나 오류가 발생한 저장 프로시저를 호출한 코드의 TRY/CATCH 블록에서 해당 오류를 잡을 수 있습니다.

일반적으로 잡을 수 없는 오류

포착할 수 없는 오류의 일반적인 예는 다음과 같습니다.

  • 컴파일 오류, 예를 들어 구문 오류,는 일괄 처리가 컴파일되지 않도록 방해합니다.
  • 일반적으로 지연된 이름 확인과 관련된 문 수준 다시 컴파일 문제. 예를 들어 알 수 없는 테이블을 참조하는 저장 프로시저를 만들 수 있습니다. 오류는 프로시저가 테이블 이름을 objectid로 확인하려고 할 때만 throw됩니다.

THROW를 사용하여 오류를 다시 throw하는 방법

매개 변수 없이 CATCH 블록에서 THROW 문이 사용되는 경우, 코드가 CATCH 블록에 들어가게 한 오류를 다시 호출합니다. 이 기법을 사용하여 오류를 포착하고 세부 정보를 로깅한 다음 원래 오류를 클라이언트 애플리케이션으로 전달하여 데이터베이스에서 오류 로깅을 구현할 수 있으며, 이후 클라이언트 애플리케이션에서 오류를 처리할 수 있습니다.

오류를 다시 발생시키는 방법의 예제입니다.

BEGIN TRY
    -- code to be executed
END TRY
BEGIN CATCH
    PRINT ERROR_MESSAGE();
    THROW
END CATCH

일부 이전 버전의 SQL Server에서는 시스템 오류를 throw하는 방법이 없었습니다. THROW는 발생시킬 시스템 오류를 지정할 수 없지만 CATCH 블록에서 매개 변수 없이 THROW를 사용하는 경우 시스템 및 사용자 오류를 모두 다시 평가합니다.

오류 처리 함수란?

CATCH 블록은 CATCH 블록 기간 동안 오류 관련 정보를 사용할 수 있도록 합니다. 여기에는 CATCH 블록 내에서 실행되는 저장 프로시저와 같은 하위 범위가 포함됩니다.

오류 처리 함수

@@ERROR 사용하여 프로그래밍할 때 다음 문이 실행되는 즉시 @@ERROR 시스템 변수가 보유한 값이 다시 설정되었음을 기억해야 합니다.

T-SQL에서 구조적 예외 처리의 또 다른 주요 이점은 일련의 오류 처리 함수가 제공되었으며 CATCH 블록 전체에서 값을 유지한다는 것입니다. 별도의 함수는 발생한 오류의 각 속성을 제공합니다.

즉, 오류 관련 정보에 계속 액세스할 수 있는 일반 오류 처리 저장 프로시저를 작성할 수 있습니다.

  • CATCH 블록은 CATCH 블록 기간 동안 오류 관련 정보를 사용할 수 있도록 합니다.
  • @@Error 다음 문이 실행되면 다시 설정됩니다.

코드에서 오류 관리

SQL CLR 통합을 사용하면 SQL Server 내에서 관리 코드를 실행할 수 있습니다. C# 및 VB와 같은 상위 수준의 .NET 언어에는 사용할 수 있는 자세한 예외 처리가 있습니다. 표준 .NET try/catch/finally 블록을 사용하여 오류를 catch할 수 있습니다.

관리 코드의 오류

일반적으로 관리 코드 내에서 가능한 한 많은 오류를 잡으려고 할 수 있습니다. 그러나 관리 코드에서 처리되지 않은 오류는 호출 T-SQL 코드로 다시 전달된다는 사실을 깨닫는 것이 중요합니다. 관리 코드에서 발생하는 모든 오류가 SQL Server에 반환될 때마다 6522 오류로 표시됩니다. ** 오류는 중첩될 수 있으며, 특정 오류는 실제 원인을 감쌀 수 있습니다.

관리 코드에서 오류가 발생하는 또 다른 드문 원인은 코드가 SqlCommand 개체를 통해 RAISERROR T-SQL 문을 실행할 수 있다는 것입니다.