Aller au contenu principal

Référence des erreurs

AUSUS utilise une taxonomie d'exceptions réduite et explicite. Chaque erreur du kernel étend une classe de base unique, ce qui permet d'intercepter largement ou finement.

La classe de base

class AususError extends \RuntimeException {}

Chaque erreur ci-dessous étend Ausus\AususError. Intercepter AususError les intercepte toutes ; le runtime distingue une erreur AUSUS d'une erreur inattendue (une erreur inattendue levée à l'intérieur d'un effet est encapsulée sous forme de EffectFailed).

Exceptions du kernel

ExceptionLevée lorsque
UnknownActioninvoke() reçoit un FQN d'action absent du graphe
PolicySubjectRequiredune action requiert un sujet mais aucun n'a été transmis
ActorRequiredun acteur est requis mais absent
TenantContextRequiredun contexte de tenant est requis mais absent
TenantBoundaryViolationle tenant d'une Reference diffère du tenant actif
PolicyDeniedla politique a renvoyé une décision autre que Permit
WorkflowStateMismatchaucune transition n'autorise l'action depuis l'état courant
WorkflowSubjectNotFoundl'enregistrement sujet du workflow n'existe pas
WorkflowGuardDeniedun garde de workflow a refusé la transition
EffectFailedun effet a levé une exception ; porte la cause sous-jacente
ConcurrencyConflictun update a été tenté avec un _version périmé
NotFoundun enregistrement référencé n'existe pas
AuditEmissionFailedle sink d'audit a rejeté l'entrée d'audit

ConcurrencyConflict et NotFound portent la Reference fautive ; ConcurrencyConflict porte également les versions expected et actual.

Mappage HTTP

ausus/api-http ajoute une exception de niveau transport, BadRequest, et mappe la taxonomie vers des codes de statut HTTP via ErrorMapper :

ExceptionStatut HTTPerror.kind
BadRequest400BadRequest
MalformedDescriptor400MalformedDescriptor
PolicyDenied403PolicyDenied
TenantBoundaryViolation403TenantBoundaryViolation
WorkflowStateMismatch409WorkflowStateMismatch
ConcurrencyConflict409ConcurrencyConflict
EffectFailure500EffectFailure
toute autre erreur500InternalError

L'enveloppe d'erreur HTTP :

{ "ok": false, "error": { "kind": "WorkflowStateMismatch", "message": "..." } }

Interception des erreurs

use Ausus\{PolicyDenied, WorkflowStateMismatch, ConcurrencyConflict, AususError};

try {
$invoker->invoke('billing.invoice.issue', $ref, []);
} catch (PolicyDenied $e) {
// actor lacks the required role
} catch (WorkflowStateMismatch $e) {
// the invoice is not in a state that allows `issue`
} catch (ConcurrencyConflict $e) {
// someone else changed the record — re-read and retry
} catch (AususError $e) {
// any other AUSUS error
}

Limites actuelles de la v0.1.0

  • La taxonomie est volontairement minimale. Elle est décrite dans le code source comme une « V0 minimal closed-ish taxonomy » — les versions ultérieures pourront ajouter des erreurs à granularité plus fine.
  • Les erreurs portent un message et (pour certaines) une Reference ; il n'y a ni catalogue structuré de codes d'erreur ni i18n des messages d'erreur en v0.1.0.