영어로 읽기

다음을 통해 공유


사용자 지정 예외

복구할 수 없는 오류가 발생한 경우 비즈니스 프로세스 관리 솔루션에서는 예외 핸들러와 사용자 지정 예외의 조합을 사용합니다.

예외 처리

호출된 오케스트레이션에서 Terminate 셰이프를 사용하는 대신 루트 오케스트레이션에서 처리되는 예외를 throw하는 패턴을 사용할 수 있습니다. 이렇게 하면 컨텍스트에 대한 가장 명확한 정보가 있는 오케스트레이션에서 예외 처리 방법을 결정할 수 있습니다. 하위 오케스트레이션에서 사용자 지정 예외를 throw하도록 하면 보다 구체적인 정보를 루트 오케스트레이션으로 전달할 수 있습니다.

비즈니스 프로세스 관리 솔루션은 이러한 패턴을 따릅니다. 솔루션에는 OrderBroker, OrderManager, CableOrder1CableOrder2의 네 가지 루트 또는 호출되지 않은 오케스트레이션이 있습니다. 세 가지 루트 오케스트레이션은 OrderManager, CableOrder1 및 CableOrder2라는 사용자 지정 예외를 수신하고 처리합니다.

일부 루트 오케스트레이션은 Terminate 셰이프를 사용하며 Terminate 셰이프는 오케스트레이션의 일반 끝점 바로 앞에 나타납니다. 오케스트레이션은 오류 발생 시 종료 셰이프를 계속 사용하므로 오케스트레이션이 완료된 것이 아니라 오류 메시지와 함께 종료된 것으로 기록됩니다. 따라서 솔루션에서 오류를 기록할 뿐만 아니라 실패한 인스턴스를 쉽게 추적할 수 있습니다.

종결 셰이프에 대한 자세한 내용은 종결 셰이프를 구성하는 방법을 참조하세요. ThrowException 셰이프에 대한 자세한 내용은 Throw 예외 셰이프를 구성하는 방법을 참조하세요.

사용자 지정 예외

다음 세 가지 사용자 지정 예외는 모두 같은 패턴을 따릅니다. 고유한 유형을 지정하면 코드에서 서로 다른 예외를 구별할 수 있습니다.

예외 Throw한 오케스트레이션
ActivateException 변경
CableOrderException Activate, CableOrder1
InterruptException CableOrder1, CheckInterrupt, ErrorHandlerOrch

모든 사용자 지정 예외는 유틸리티 어셈블리에 정의됩니다. 사용자 지정 예외는 모두 .NET 클래스이며, 모든 사용자 지정 예외 클래스는 .NET ApplicationException 클래스에서 상속되며, 이 클래스는 System.Exception 클래스에서 상속됩니다. 예외는 디하이드레이션(데이터베이스에 serialize되어 저장)될 수 있기 때문에 deserialization 생성자를 구현해야 합니다. 역직렬화 생성자는 SerializationInfo 개체와 StreamingContext 개체의 두 인수를 사용하는 생성자입니다. deserialization 생성자는 예외를 리하이드레이션하는 동안 사용됩니다. ApplicationException 클래스는 이미 역직렬화 생성자를 구현하므로 사용자 지정 예외에 대한 생성자는 단순히 기본(ApplicationException) 역직렬화 생성자를 호출합니다. 예를 들어 InterruptException 에는 다음 생성자가 포함됩니다.

// "info" is the object holding the serialized object data.  
// "context" is the contextual information about the source  
// or destination.  
public InterruptException(SerializationInfo info,  
                  StreamingContext context) : base(info, context) { }  

사용자 지정 serialization에 대한 자세한 내용은 .NET Framework 개발자 가이드의 사용자 지정 직렬화를 참조하세요.

중첩된 예외 핸들러와 보정 블록

사용자 지정 예외는 특수화된 예외로 사용될 뿐만 아니라 일부 위치에서 정렬 플래그의 역할을 합니다. 변경 오케스트레이션에는 취소 작업을 롤백해야 하는 두 위치가 있습니다.

참고

Visual Studio에서 변경 오케스트레이션이 열려 있는 상태에서 이 섹션을 읽을 수 있습니다.

오케스트레이션 맨 위에서 취소 오케스트레이션에 대한 호출이 실패하면 CancelCompensation 블록이 실행되고 Cancel 트랜잭션을 롤백합니다. 모든 것이 잘 진행되면 오케스트레이션은 오케스트레이션 활성화 를 호출합니다.

활성화 작업이 실패하면 트랜잭션 취소도 롤백해야 합니다. 그러나 활성화 호출에 대한 예외 처리기는 Cancel 트랜잭션에 대해 아무것도 알지 않습니다. 이를 처리하기 위해 전체 오케스트레이션에 대한 예외 핸들러가 있습니다. 이 처리기는 Cancel scope 포함하므로 Cancel 트랜잭션에 대해 알고 있습니다. 처리기는 Activate scope(ActivateException)에서 throw된 예외를 catch하고 Cancel 트랜잭션을 롤백한 다음 변경 오케스트레이션을 호출한 오케스트레이션이 추가 처리를 수행할 수 있도록 예외를 다시 throw합니다.

이 디자인은 활성화가 실패하는 경우에만 취소 를 보 합니다. Cancel이 실패하고 예외를 throw하는 경우 취소는 발생하지 않으며 보정해서는 안 됩니다.

보정 블록 및 보정 셰이프에 대한 자세한 내용은 보 정 셰이프를 구성하는 방법을 참조하세요.

참고 항목

비즈니스 프로세스 관리 솔루션의 예외 처리
ExceptionHandler 오케스트레이션