演習 - エラー処理

完了

このユニットでは、Linux ターミナルとして画面の右側にある Azure Cloud Shell を使用します。 Azure Cloud Shell は、Azure portal または https://shell.azure.com でアクセスできるシェルです。 お使いのコンピューターに何もインストールしなくても使用できます。

この演習では、Try/Catch ブロックを使用して、特定の条件が満たされない場合にスクリプトが早期に応答しなくなるようにします。 もう一度バックアップ スクリプトを操作します。

誤ったパスを指定したために、バックアップする必要のないファイルのバックアップが生成されたことがあるとわかっているとします。 いくつかのエラー管理を追加することにしました。

このモジュールの前の演習を完了していない場合 にのみ 、次のコマンドを実行します。 これまでの演習を完了していることを前提としています。 まだ終わっていない場合は、いくつかのファイルが必要です。

  1. このモジュールのこれまでの演習を完了していない場合は、次の bash コマンドをターミナルで実行します。

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

    これらのコマンドにより、通常、Web 開発に関連付けられているファイルを含むディレクトリが作成されます。

  2. Backup.ps1 という名前 のファイルも必要です。 これらのコマンドを実行します。

    touch Backup.ps1
    code Backup.ps1
    

    エディターを実行しているので、必要なコードを追加します。 このコードをエディターに貼り付け、ファイルを保存します。

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

Try/Catch を使用してビジネス要件を実装する

会社では主に Web アプリを構築しているとします。 これらのアプリは、HTML、CSS、JavaScript ファイルで構成されています。 Web アプリを認識するようにスクリプトを最適化することにします。

  1. 既存の PowerShell シェルを実行している場合は、これを使用します。 それ以外の場合は、ターミナルで「pwsh」と入力して起動します。

    pwsh
    
  2. Backup.ps1を開きます。 Param セクションで、最後のパラメーターの後にコンマを追加し、次のパラメーターを追加します。

    [switch]$PathIsWebApp
    

    switch パラメーターを追加しました。 スクリプトが呼び出されたときにこのパラメーターが存在する場合は、コンテンツのチェックを実行します。 その後、バックアップ ファイルを作成する必要があるかどうかを判断できます。

  3. Param セクションの下に次のコードを追加し、ファイルを保存します。

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

    前のコードでは、パラメーター $PathIsWebApp が実行時に提供されているかどうかを最初に確認します。 その場合、$Path で指定されたディレクトリからファイル拡張子の一覧がコードによって引き続き取得されます。 この例では、 Webapp ディレクトリでコードのその部分を実行すると、次のコードによって項目の一覧が出力されます。

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

    出力は次のようになります。

    .html
    .js
    

    完全なステートメントでは、-match 演算子を使用しています。 -match 演算子では正規表現パターンが想定されています。 この場合、式には ".html.js.css に一致するファイル拡張子はありますか?" と記述されています。ステートメントの結果は、変数 $ContainsApplicationFiles に保存されます。

    次に、If ブロックで $ContainsApplicationFiles 変数が True または False であるかどうかがチェックされます。 この時点で、コードは次の 2 つのパスを取ることができます。

    • ソース ディレクトリが Web アプリ用の場合、スクリプトは "ソース ファイルが適切に見える、続行" と書き込みます。
    • ソース ディレクトリが Web アプリ用でない場合、スクリプトは "Web アプリではない" というエラーをスローします。エラーは、 Catch ブロックでキャッチされます。 スクリプトは停止され、改善したエラー メッセージでエラーを再スローします。
  4. スイッチ $PathIsWebApp を指定してスクリプトをテストします。

    スクリプトを実行する前に、.zip ファイルが存在しないことを確認します。 これらは、このモジュールのこれまでの演習を完了したときに作成されている可能性があります。 Remove-Item *zip を使用して削除します。

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

    スクリプトにより、次のテキストのように出力されます。

    Source files looks good, continuing
    Created backup at ./backup-2021-12-30.zip
    
  5. ターミナルを使用して、 python-app という名前のディレクトリを作成します。 新しいディレクトリで、 script.py という名前のファイルを作成します。

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

    ディレクトリは次のようになります。

    -| webapp/
    ---| app.js
    ---| index.html
    -| python-app/
    ---| script.py
    -| Backup.ps1
    
  6. PowerShell シェルでスクリプトをもう一度実行します。今回は、-Path をポイントするように ./python-app 値を変更します。

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

    スクリプトにより次のテキストが出力されます。

    No backup created due to: Not a web app
    

    この出力は、チェックが失敗したことを示しています。 ディレクトリに .html、.js、または .css 拡張子の付いたファイルが存在しないためにこのようになりました。 コードにより、Catch ブロックでキャッチされた例外が発生し、スクリプトは早期に停止しました。

    おめでとうございます。 ビジネス要件の実装が終わりました。