Eccezioni personalizzate
Qualora si verifichi un errore irreversibile, nella soluzione Gestione dei processi di business viene utilizzata una combinazione di gestori di eccezioni e di eccezioni personalizzate.
Anziché usare le forme Termina nelle orchestrazioni denominate è possibile usare il modello di generazione di eccezioni gestite dall'orchestrazione radice. In questo modo l'orchestrazione con la maggiore conoscenza del contesto è in grado di decidere a proposito della gestione dell'eccezione. Se le orchestrazioni subordinate generano eccezioni personalizzate, è possibile comunicare informazioni più specifiche all'orchestrazione radice.
La soluzione Gestione dei processi di business segue questo modello. Nella soluzione sono presenti quattro radice, o non chiamate, orchestrazioni: OrderBroker, OrderManager, CableOrder1 e CableOrder2. Tre delle orchestrazioni radice ricevono e gestiscono eccezioni personalizzate: OrderManager, CableOrder1 e CableOrder2.
Si noti che alcune delle orchestrazioni radice usano la forma Termina e che la forma Termina viene visualizzata appena prima del normale punto finale dell'orchestrazione. L'orchestrazione usa comunque la forma Termina nel caso di un errore in modo che l'orchestrazione venga registrata come terminata, anziché completata ma con un messaggio di errore. In questo modo la soluzione è in grado di tenere facilmente traccia delle istanze non riuscite oltre a registrare l'errore.
Per altre informazioni sulla forma Termina , vedere Come configurare la forma termina. Per altre informazioni sulla forma ThrowException , vedere Come configurare la forma genera eccezione.
Ciascuna delle tre eccezioni personalizzate seguenti utilizza lo stesso modello. L'esistenza di tipi distinti consente al codice distinguere eccezioni diverse.
Eccezione | Generata da (orchestrazione) |
---|---|
ActivateException | Modifica |
CableOrderException | Attiva, CableOrder1 |
InterruptException | CableOrder1, CheckInterrupt, ErrorHandlerOrch |
Tutte le eccezioni personalizzate sono definite nell'assembly Utilità . Le eccezioni personalizzate sono tutte classi .NET. Tutte le classi di eccezioni personalizzate ereditano dalla classe .NET ApplicationException che a sua volta eredita dalla classe System.Exception . Poiché esiste la possibilità che l'eccezione venga disidratata (serializzata e archiviata nel database), le eccezioni devono implementare un costruttore di deserializzazione. Un costruttore di deserializzazione è un costruttore che accetta due argomenti: un oggetto SerializationInfo e un oggetto StreamingContext. Il costruttore di deserializzazione verrà utilizzato durante la riattivazione dell'eccezione. Poiché la classe ApplicationException implementa già un costruttore di deserializzazione, il costruttore per l'eccezione personalizzata richiama semplicemente il costruttore di deserializzazione (ApplicationException). Ad esempio, l'eccezione InterruptException include il costruttore seguente:
// "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) { }
Per informazioni più dettagliate sulla serializzazione personalizzata, vedere Serializzazione personalizzata nella Guida per sviluppatori di .NET Framework.
Oltre a fungere da eccezioni specializzate, in diversi casi le eccezioni personalizzate vengono anche utilizzate come flag di ordinamento. Nell'orchestrazione Modifica sono presenti due posizioni da eseguire il rollback dell'operazione Annulla.
Nota
È possibile leggere questa sezione con l'apertura modifica orchestrazione in Visual Studio.
Nella parte superiore dell'orchestrazione, se la chiamata all'orchestrazione Annulla ha esito negativo, il blocco CancelCompensation viene eseguito e esegue il rollback della transazione Annulla. Se tutto va bene, l'orchestrazione chiama l'orchestrazione Attiva .
Se l'operazione Attiva ha esito negativo, è necessario eseguire anche il rollback della transazione Annulla . Tuttavia, il gestore eccezioni per la chiamata a Attiva non conosce nulla sulla transazione Annulla . Per risolvere il problema, esiste un gestore di eccezioni per l'intera orchestrazione. Questo gestore, perché contiene l'ambito Annulla , conosce la transazione Annulla . Il gestore rileva l'eccezione generata dall'ambito Attiva ( attivazioneException), esegue il rollback della transazione Cancel e quindi genera di nuovo l'eccezione in modo che l'orchestrazione denominata Orchestrazione modifica possa eseguire qualsiasi elaborazione aggiuntiva.
Si noti che questa progettazione compensa solo l'annullamento se l'attivazione ha esito negativo. Se l'annullamento ha esito negativo e genera un'eccezione, l'annullamento non è mai stato eseguito e non deve essere compensato.
Per altre informazioni sui blocchi di compensazione e sulla forma Compensata , vedere Come configurare la forma Di compensazione.
Gestione delle eccezioni nella soluzione di gestione dei processi di business
Orchestrazione ExceptionHandler