복구할 수 없는 오류가 있는 경우 비즈니스 프로세스 관리 솔루션은 예외 처리기와 사용자 지정 예외의 조합을 사용합니다.
예외 처리
호출된 오케스트레이션에서 종결 셰이프를 사용하는 대신 최상위 오케스트레이션에서 처리되는 예외를 발생시키는 패턴을 사용할 수 있습니다. 이렇게 하면 컨텍스트에 대한 가장 광범위한 지식을 가진 오케스트레이션이 예외 처리에 대한 결정을 내릴 수 있습니다. 하위 오케스트레이션이 사용자 지정 예외를 throw하도록 하면 루트 오케스트레이션에 보다 구체적인 정보를 전달할 수 있습니다.
비즈니스 프로세스 관리 솔루션은 이 패턴을 따릅니다. 솔루션에는 OrderBroker, OrderManager, CableOrder1 및 CableOrder2의 네 가지 루트 또는 호출되지 않은 오케스트레이션이 있습니다. 세 가지 루트 오케스트레이션은 OrderManager, CableOrder1 및 CableOrder2라는 사용자 지정 예외를 수신하고 처리합니다.
일부 루트 오케스트레이션은 Terminate 셰이프를 사용하며 Terminate 셰이프는 오케스트레이션의 일반 끝점 바로 앞에 나타납니다. 오케스트레이션은 오류 발생 시 종료 셰이프를 계속 사용하므로 오케스트레이션은 완료된 것이 아니라 오류 메시지와 함께 종료된 것으로 기록됩니다. 이렇게 하면 솔루션에서 오류를 기록하는 것 외에도 실패한 인스턴스를 쉽게 추적할 수 있습니다.
종결 셰이프에 대한 자세한 내용은 종결 셰이프를 구성하는 방법을 참조하세요. ThrowException 셰이프에 대한 자세한 내용은 Throw 예외 셰이프를 구성하는 방법을 참조하세요.
사용자 지정 예외
다음 세 가지 사용자 지정 예외는 각각 동일한 패턴을 따릅니다. 고유 형식을 사용하면 코드에서 다른 예외를 구분할 수 있습니다.
| 예외 | 발생됨(오케스트레이션) |
|---|---|
| ActivateException | 변경 |
| CableOrderException | Activate, CableOrder1 |
| InterruptException | CableOrder1, CheckInterrupt, ErrorHandlerOrch |
모든 사용자 지정 예외는 유틸리티 어셈블리에 정의됩니다. 사용자 지정 예외는 모두 .NET 클래스입니다. 모든 사용자 지정 예외 클래스는 .NET ApplicationException 클래스에서 상속되며, 이 클래스는 System.Exception 클래스에서 상속됩니다. 예외가 탈수될 수 있으므로(직렬화되고 데이터베이스에 저장됨) 예외는 역직렬화 생성자를 구현해야 합니다. 역직렬화 생성자는 SerializationInfo 개체와 StreamingContext 개체의 두 인수를 사용하는 생성자입니다. 역직렬화 생성자는 예외를 리하일레이션하는 동안 사용됩니다. 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 개발자 가이드의 사용자 지정 Serialization을 참조하세요.
중첩된 예외 처리기 및 보정 블록
특수한 예외로 사용되는 것 외에도 여러 위치의 사용자 지정 예외는 정렬 플래그 역할을 합니다. 변경 오케스트레이션에는 취소 작업을 롤백해야 하는 두 가지 위치가 있습니다.
메모
Visual Studio에서 변경 오케스트레이션이 열려 있는 상태에서 이 섹션을 읽을 수 있습니다.
오케스트레이션 맨 위에서 취소 오케스트레이션에 대한 호출이 실패하면 CancelCompensation 블록이 실행되고 Cancel 트랜잭션을 롤백합니다. 모든 것이 잘 진행되면, 오케스트레이션은 Activate 오케스트레이션을 호출합니다.
활성화 작업이 실패하면 취소 트랜잭션도 롤백해야 합니다. 그러나 활성화 호출에 대한 예외 처리기는 Cancel 트랜잭션에 대해 아무것도 알지 못합니다. 이를 처리하기 위해 전체 오케스트레이션에 대한 예외 처리기가 있습니다. 이 처리기는 Cancel 범위를 포함하므로 Cancel 트랜잭션에 대해 알고 있습니다. 처리기는 Activate 범위에서 발생한 ActivateException 예외를 catch하고, Cancel 트랜잭션을 롤백한 다음, Change 오케스트레이션을 호출한 오케스트레이션이 추가적인 처리를 할 수 있도록 예외를 다시 throw합니다.
이 디자인은 활성화가 실패하는 경우에만 취소를 보정합니다. 취소가 실패하고 예외를 발생시키는 경우 취소는 발생하지 않았고 보상 조치를 해서는 안 됩니다.
보정 블록 및 보정 셰이프에 대한 자세한 내용은 보정셰이프를 구성하는 방법을 참조하세요.