try mot clé de début du bloc try dans une instruction de contrôle try-catch
catch mot clé de début du bloc catch dans une instruction de contrôle try-catch

## Séquence d'appel

                try
                statements
                catch
                statements
                end

## Description

L'instruction de contrôle `try`-`catch` peut être utilisée pour controler les conséquences d'une erreur d'exécution en permettant l'exécution de code spécifique en cas d'erreur.

Quand une instruction de contrôle `try`-`catch` est exécutée, normalement seules les instructions comprises entre les mots clés `try` et `catch` sont exécutées. Cependant, si une erreur se produit pendant l'exécution de ces instructions, l'erreur est mémorisée, les instructions restantes jusqu'au mot clé `catch` sont ignorées et les instructions comprises entre les mots clés `catch` et `end` sont exécutées en utilisant le mode de gestion des erreurs par défaut.

L'erreur mémorisée peut être retrouvée en utilisant la fonction lasterror.

Les intructions comprises entre les mots clés `catch` et `end` peuvent être omises ainsi que le mot clé `catch` si aucun code alternatif n'est fourni.

Notez que l'on peut aussi utiliser la fonction execstr avec l'argument `'errcatch'` pour gérer les erreurs et tout particulièrement pour gérer les erreurs de syntaxe.

Notez également que `try-catch` est plus ou moins similaire à :

    if execstr("<instructions du bloc try>","errcatch")<>0 then
      <instructions du bloc catch>
    end

Il utilise le même mécanisme interne que "errcatch". C'est pourquoi execstr(...,"errcatch") ne peut pas être utilisé à l'intérieur d'une structure `try`-`catch`. Un tel contexte est détecté et génère un message d'erreur spécifique (cette erreur est masquée et mémorisée comme n'importe quelle autre erreur si elle se produit dans le bloc `try`).

Par contre plusieurs structures `try`-`catch` peuvent être imbriquées les unes dans les autres (voir le deuxième exemple ci-dessous).

## Exemples

    // premier exemple
    file_path=TMPDIR+'/wrong'
    try
      u=mopen(file_path,'r')
      x=mget(10,'c',u)
    catch
      disp(['le fichier '+file_path+ 'ne peut pas être lu',
            'on utilise la valeur  par défaut de x'])
      x=1:10
    end
    [error_message,error_number]=lasterror(%t)

    // 2ème exemple (structures try/catch imbriquées)
    function nestedtry(a,b)
    disp("DEBUT")
    mprintf("\ta est %s\t\tb est %s\n",string(a),string(b))
    try
      disp("try 1")
      try
        disp("try 2")
        z=a+1;  // err si chaîne
      catch
        disp("catch 2")
        t=b+1;  // err si chaîne
      end
      disp("après try 2")
    catch
      disp("catch 1")
    end
    disp("après try 1 - FIN")
    endfunction
    nestedtry(1,1)
    nestedtry("une chaîne",1)
    nestedtry(1,"une chaîne")
    nestedtry("une chaîne","une chaîne")

## Voir aussi

- error
- execstr
- if
- lasterror

## Historique

6.0.0 `try` et `catch` sont maintenant protégés. Les affectations telles que `try=1` ou `catch=2` ne sont plus possibles.