Exercice – Traitement des erreurs

Effectué

Dans cet exercice, vous allez utiliser un bloc Try/Catch pour vous assurer que le script cesse de répondre de façon anticipée si une condition donnée n’est pas remplie. Vous travaillerez à nouveau avec votre script de sauvegarde.

Supposons que vous ayez remarqué que vous spécifiez parfois un chemin erroné, ce qui entraîne la sauvegarde de fichiers qui ne devraient pas être sauvegardés. Vous décidez d’ajouter une gestion des erreurs.

Notes

Cet exercice est facultatif. Si vous souhaitez effectuer cet exercice, vous devez créer un abonnement Azure avant de commencer. Si vous n’avez pas de compte Azure ou si vous ne souhaitez pas en créer un à ce stade, vous pouvez lire les instructions pour comprendre les informations qui sont présentées.

Notes

Dans cette unité, vous utilisez Azure Cloud Shell comme terminal. Vous pouvez accéder à Cloud Shell via le portail Azure ou la connexion Cloud Shell. Vous n’avez pas besoin d’installer quoi que ce soit sur votre PC ou ordinateur portable pour l’utiliser.

Notes

Exécutez les commandes suivantes uniquement si vous n’avez effectué aucun des exercices précédents dans ce module. Nous supposons que vous avez effectué les exercices précédents. Si ce n’est pas le cas, vous avez besoin de quelques fichiers.

  1. Si vous n’avez pas effectué les exercices précédents de ce module, exécutez les commandes bash suivantes dans un terminal :

    mkdir webapp
    cd webapp
    touch index.html app.js
    cd ..
    

    Ces commandes créent un répertoire contenant les fichiers généralement associés à un développement web.

  2. Vous avez également besoin d’un fichier nommé Backup.ps1. Exécutez ces commandes :

    touch Backup.ps1
    code Backup.ps1
    

    Maintenant que vous avez un éditeur en cours d’exécution, ajoutez le code requis. Collez ce code dans l’éditeur et enregistrez le fichier :

    Param(
         [string]$Path = './app',
         [string]$DestinationPath = './'
       )
    
    If(-Not (Test-Path $Path)) 
    {
       Throw "The source directory $Path does not exist, please specify an existing directory"
    }
    
    $date = Get-Date -format "yyyy-MM-dd"
    
    $DestinationFile = "$($DestinationPath + 'backup-' + $date + '.zip')"
    If (-Not (Test-Path $DestinationFile)) 
    {
      Compress-Archive -Path $Path -CompressionLevel 'Fastest' -DestinationPath "$($DestinationPath + 'backup-' + $date)"
      Write-Host "Created backup at $($DestinationPath + 'backup-' + $date + '.zip')"
    } Else {
      Write-Error "Today's backup already exists"
    }
    

Implémenter un besoin métier en utilisant Try/Catch

Supposons que votre entreprise crée principalement des applications web. Ces applications se composent de fichiers HTML, CSS et JavaScript. Vous décidez d’optimiser le script pour reconnaître les applications web.

  1. Utilisez un interpréteur de commandes PowerShell existant si vous en avez un d’opérationnel. Dans le cas contraire, démarrez-en un en tapant pwsh dans un terminal :

    pwsh
    
  2. Ouvrez Backup.ps1. Dans la section Param, ajoutez une virgule après le dernier paramètre, puis ajoutez le paramètre suivant :

    [switch]$PathIsWebApp
    

    Vous avez ajouté un paramètre de commutateur. Si ce paramètre est présent lorsque le script est appelé, vous effectuez la vérification du contenu. Après cela, vous pouvez déterminer si un fichier de sauvegarde doit être créé.

  3. Sous la section Param, ajoutez ce code, puis enregistrez le fichier :

    If ($PathIsWebApp -eq $True) {
       Try 
       {
         $ContainsApplicationFiles = "$((Get-ChildItem $Path).Extension | Sort-Object -Unique)" -match  '\.js|\.html|\.css'
    
         If ( -Not $ContainsApplicationFiles) {
           Throw "Not a web app"
         } Else {
           Write-Host "Source files look good, continuing"
         }
       } Catch {
        Throw "No backup created due to: $($_.Exception.Message)"
       }
    }
    

    Le code précédent commence par vérifier si le paramètre $PathIsWebApp est fourni au moment de l’exécution. Si c’est le cas, le code continue d’obtenir la liste des extensions de fichier à partir du répertoire spécifié par $Path. Dans notre cas, si vous exécutez cette partie du code sur le répertoire webapp , le code suivant imprime une liste d’éléments :

    (Get-ChildItem $Path).Extension | Sort-Object -Unique
    

    Voici le format :

    .html
    .js
    

    Dans l’instruction complète, nous utilisons l’opérateur -match. L’opérateur -match attend un modèle d’expression régulière. Dans ce cas, l’expression stipule « Une ou plusieurs extensions de fichier correspondent-elles à .html, .js ou .css ? ». Le résultat de l’instruction est enregistré dans la variable $ContainsApplicationFiles.

    Ensuite, le bloc If vérifie si la variable $ContainsApplicationFiles a pour valeur True ou False. À ce stade, le code peut accepter deux chemins d’accès :

    • Si le répertoire source est destiné à une application web, le script affiche « Les fichiers sources semblent en ordre, on continue ».
    • Si le répertoire source n’est pas destiné à une application web, le script génère une erreur indiquant « Pas une application web ». L’erreur est interceptée dans un Catch bloc. Le script s’arrête et vous générez à nouveau l’erreur avec un message d’erreur amélioré.
  4. Testez le script en fournissant le commutateur $PathIsWebApp:

    Notes

    Avant d’exécuter le script, assurez-vous qu’aucun fichier .zip n’est présent. De tels fichiers ont pu être créés quand vous avez effectué les exercices précédents de ce module. Utilisez Remove-Item *zip pour les supprimer.

    ./Backup.ps1 -PathIsWebApp -Path './webapp'
    

    Le script doit afficher une sortie similaire à ce texte :

    Source files looks good, continuing
    Created backup at ./backup-2021-12-30.zip
    
  5. À l’aide de votre terminal, créez un répertoire nommé python-app. Dans le nouveau répertoire, créez un fichier appelé script.py :

    mkdir python-app
    cd python-app
    touch script.py
    cd ..
    

    Votre répertoire doit maintenant ressembler à ceci :

    -| webapp/
    ---| app.js
    ---| index.html
    -| python-app/
    ---| script.py
    -| Backup.ps1
    
  6. Dans l’interpréteur de commandes PowerShell, réexécutez le script, mais cette fois en changeant la valeur -Path pour qu’elle pointe sur ./python-app :

    ./Backup.ps1 -PathIsWebApp -Path './python-app'
    

    Votre script doit maintenant afficher ce texte :

    No backup created due to: Not a web app
    

    La sortie indique que la vérification a échoué. Cela devait se produire, car le répertoire ne contient aucun fichier doté d’une extension .html, .js ni .css. Votre code a levé une exception qui a été interceptée par votre bloc Catch, et le script s’est arrêté de façon anticipée.

    Félicitations ! Vous avez implémenté un besoin métier.