Übung: Fehlerbehandlung

Abgeschlossen

In dieser Übung stellen Sie mit einem Try/Catch-Block sicher, dass das Skript nicht frühzeitig stoppt, wenn eine bestimmte Bedingung nicht erfüllt ist. Sie arbeiten wieder mit Ihrem Sicherungsskript.

Sie haben beispielsweise bemerkt, dass Sie manchmal einen fehlerhaften Pfad angeben, der eine Sicherung von Dateien verursacht, die nicht gesichert werden sollten. Sie entscheiden sich, eine Fehlerverwaltung hinzuzufügen.

Hinweis

Diese Übung ist optional. Wenn Sie diese Übung abschließen möchten, müssen Sie ein Azure-Abonnement erstellen, bevor Sie beginnen. Wenn Sie nicht über ein Azure-Konto verfügen oder derzeit kein Azure-Konto erstellen möchten, können Sie die Anweisungen durchlesen, damit Sie die informationen verstehen, die präsentiert werden.

Hinweis

In dieser Einheit verwenden Sie Azure Cloud Shell als Terminal. Sie können über das Azure-Portal oder die Cloud Shell-Anmeldung auf die Cloud Shell zugreifen. Sie müssen nichts auf Ihrem PC oder Laptop installieren, um es zu verwenden.

Hinweis

Führen Sie die folgenden Befehle nur aus, wenn Sie keine der vorherigen Übungen in diesem Modul abgeschlossen haben. Wir gehen davon aus, dass Sie die vorherigen Übungen abgeschlossen haben. Wenn Sie dies noch nicht getan haben, benötigen Sie einige Dateien.

  1. Wenn Sie die vorherigen Übungen in diesem Modul noch nicht abgeschlossen haben, führen Sie die folgenden Bash-Befehle in einem Terminal aus:

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

    Mit diesen Befehlen wird ein Verzeichnis mit Dateien erstellt, die normalerweise zum Bereich der Webentwicklung gehören.

  2. Sie benötigen auch eine Datei mit dem Namen Backup.ps1. Führen Sie die folgenden Befehle aus:

    touch Backup.ps1
    code Backup.ps1
    

    Nachdem Sie nun einen Editor ausgeführt haben, fügen Sie den erforderlichen Code hinzu. Fügen Sie diesen Code in den Editor ein, und speichern Sie die Datei:

    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"
    }
    

Implementieren einer Geschäftsanforderung mit Try/Catch

Angenommen, Ihr Unternehmen erstellt hauptsächlich Web-Apps. Diese Apps bestehen aus HTML-, CSS- und JavaScript-Dateien. Sie entscheiden sich für die Optimierung des Skripts, damit dieses Web-Apps erkennt.

  1. Verwenden Sie eine vorhandene PowerShell-Shell, wenn Sie eine haben, die ausgeführt wird. Starten Sie andernfalls eine, indem Sie pwsh in ein Terminal eingeben:

    pwsh
    
  2. Öffnen Backup.ps1. Fügen Sie im Abschnitt Param hinter dem letzten Parameter ein Komma und dann den folgenden Parameter hinzu:

    [switch]$PathIsWebApp
    

    Sie haben einen Switch-Parameter hinzugefügt. Wenn dieser Parameter beim Aufrufen des Skripts vorhanden ist, wird eine Überprüfung des Inhalts durchgeführt. Danach können Sie festlegen, ob eine Sicherungsdatei erstellt werden soll.

  3. Fügen Sie im Param Abschnitt diesen Code hinzu, und speichern Sie dann die Datei:

    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)"
       }
    }
    

    Der vorangehende Code überprüft zunächst, ob der Parameter $PathIsWebApp zur Laufzeit bereitgestellt wird. Wenn ja, ruft der Code weiterhin eine Liste der Dateierweiterungen aus dem Verzeichnis ab, das durch $Path angegeben wird. Wenn Sie diesen Teil des Codes im Webapp-Verzeichnis ausführen, druckt der folgende Code eine Liste von Elementen:

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

    So sieht die Ausgabe aus:

    .html
    .js
    

    In der vollständigen Anweisung verwenden wir den -match-Operator. Der -match-Operator erwartet ein Muster für reguläre Ausdrücke. In diesem Fall besagt der Ausdruck „stimmt eine der Dateierweiterungen mit .html, .js oder .css überein?“ Das Ergebnis der Anweisung wird in der Variable $ContainsApplicationFiles gespeichert.

    Anschließend überprüft der If-Block, ob die Variable $ContainsApplicationFilesTrue oder False ist. An diesem Punkt kann der Code zwei Pfade nehmen:

    • Wenn das Quellverzeichnis für eine Web-App bestimmt ist, schreibt das Skript "Quelldateien sehen gut aus, fortsetzen".
    • Wenn das Quellverzeichnis nicht für eine Web-App bestimmt ist, löst das Skript einen Fehler aus, der "Keine Web-App" besagt. Der Fehler wird in einem Catch Block abgefangen. Das Skript wird beendet, und Sie geben den Fehler mit einer verbesserten Fehlermeldung erneut aus.
  4. Testen Sie das Skript, indem Sie den Schalter $PathIsWebApp bereitstellen:

    Hinweis

    Stellen Sie vor dem Ausführen des Skripts sicher, dass keine ZIP-Dateien vorhanden sind. Möglicherweise wurden welche erstellt, als Sie vorherige Übungen in diesem Modul durchgeführt haben. Verwenden Sie Remove-Item *zip, um sie zu entfernen.

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

    Das Skript sollte einen ähnlichen Text wie diesen ausgeben:

    Source files looks good, continuing
    Created backup at ./backup-2021-12-30.zip
    
  5. Erstellen Sie mit Ihrem Terminal ein Verzeichnis namens python-app. Erstellen Sie im neuen Verzeichnis eine Datei namens script.py:

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

    Das Verzeichnis sollte jetzt wie folgt aussehen:

    -| webapp/
    ---| app.js
    ---| index.html
    -| python-app/
    ---| script.py
    -| Backup.ps1
    
  6. Führen Sie das Skript in der PowerShell-Shell noch mal aus, ändern Sie dieses Mal jedoch den -Path-Wert so, dass er auf ./python-app verweist:

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

    Ihr Skript sollte nun diesen Text ausgeben:

    No backup created due to: Not a web app
    

    Die Ausgabe gibt an, dass die Überprüfung fehlgeschlagen ist. Das ist richtig so, da sich im Verzeichnis keine Dateien mit einer HTML-, JS- oder CSS-Erweiterung befinden. Ihr Code hat eine Ausnahme ausgelöst, die von Ihrem Catch-Block abgefangen wurde, und das Skript wurde frühzeitig beendet.

    Glückwunsch! Sie haben eine geschäftliche Anforderung implementiert.