# 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 (voir errcatch).

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 errcatch ou execstr(...,"errcatch") ne peut pas être utilisé à l'intérieur d'une structure `try`-`catch`. Un tel contexte est détecté et gérè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
- errcatch