
Plus tôt dans ce cours, nous avons examiné la gestion des erreurs à l'aide des instructions TRY, CATCH et ENDTRY. Après l'instruction TRY est fournie l'instruction qui peut entraîner une erreur. Si l'erreur survient, le système passe à l'instruction CATCH et traite son contenu. Quoi qu'il arrive, la méthode poursuit le traitement après l'instruction ENDTRY.

Dans un bloc TRY…ENDTRY, vous pouvez inclure plusieurs instructions CATCH. Cela vous permet de traiter différentes exceptions différemment.

Vous pouvez répertorier plusieurs exceptions dans une seule instruction CATCH. Dans cet exemple, le même bloc CATCH sera traité si le système déclenche cx_sy_arithmetic_error ou cx_sy_zerodivide.

Lorsque vous répertoriez une classe dans une instruction CATCH, le système traite le bloc correspondant si une exception avec cette classe ou l'une de ses sous-classes est déclenchée. Dans cet exemple, cx_sy_arithmetic_error est une surclasse de cx_sy_arithmetic_overflow et cx_sy_zerodivide. En conséquence, le bloc sera traité si une exception de type de l'une des sous-classes est déclenchée.

Toutes les classes d'exception font partie d'une hiérarchie d'héritage dont la surclasse la plus élevée est la classe cx_root. Comme nous l'avons déjà vu, si vous utilisez une surclasse dans une instruction CATCH, le système y accède si une exception avec le type de l'une de ses sous-classes est déclenchée. Comme toutes les classes d'exception sont des sous-classes de cx_root, l'instruction CATCH cx_root est suffisante pour intercepter une exception.
Séquence des instructions CATCH

Lorsque vous écrivez des instructions CATCH, vous devez placer la ou les classes les plus spécifiques en premier et les plus génériques en dernier. Si vous placez une surclasse au-dessus de l'une de ses sous-classes, vous provoquerez une erreur de syntaxe. En effet, le système n'a pas pu traiter le bloc CATCH spécifique car il est éclipsé par le bloc plus générique.
L'ajout INTO
Chaque exception est représentée par un objet. Vous pouvez placer cet objet dans une variable de référence et l'utiliser - par exemple, pour récupérer le texte d'erreur de la classe d'exception à l'aide de la méthode get_text( ) comme illustré dans l'exemple ici.

Vous pouvez utiliser une déclaration en ligne dans l'instruction CATCH pour vous assurer que la variable de référence est déclarée avec le type correct.
La chose la plus courante à faire avec l'objet d'exception est d'appeler sa méthode get_text( ). Cependant, les objets d'exception peuvent posséder d'autres attributs et méthodes pour vous aider à traiter l'erreur.

Les classes d'exception peuvent avoir des attributs qui décrivent plus précisément ce qui s'est mal passé. Ces attributs sont souvent utilisés pour renseigner les caractères génériques des messages. Vous définissez un attribut dans la section publique de la classe d'exception avec son nom et son type appropriés.
Pour renseigner un attribut lorsque l'exception est déclenchée, vous avez besoin d'un paramètre d'import correspondant du constructeur de la classe d'exception. Vous pouvez générer ce paramètre d'importation à l'aide d'un correctif rapide. Positionnez le curseur sur le nom de méthode constructor et appuyez sur Ctrl + 1. Sélectionnez le correctif rapide Régénérer le constructeur.
Propagation des exceptions

Une méthode peut propager une exception tout au long de la chaîne d'appel. Au lieu d'utiliser l'instruction CATCH pour traiter l'exception, la méthode inclut la clause RAISING dans sa définition. Cela indique aux appelants de la méthode que l'exception peut leur être transmise.
Si l'exception n'est interceptée nulle part dans la chaîne d'appel, une erreur d'exécution se produit.
Attribut previous
Parfois, dans une chaîne d'appels, une méthode intercepte une exception et, en réponse, elle déclenche une exception différente pour son propre appelant à intercepter. Cela peut se produire, par exemple, si une structure déclenche une exception trop orientée techniquement pour que l'application puisse être traitée. La méthode qui déclenche sa propre exception peut transmettre la première exception. Pour ce faire, il utilise l'attribut previous de la classe d'exception.

Lorsque vous déclenchez une exception, vous pouvez transférer une instance d'une classe d'exception au paramètre d'importation previous. L'objet d'exception est alors attaché à la nouvelle exception. Une méthode qui intercepte la deuxième exception peut accéder au premier objet d'exception à l'aide de l'attribut public en lecture seule previous.
Comme previous est implémenté dans la surclasse cx_root, il est disponible dans toutes les classes d'exception.