演習 - エラー処理
このユニットでは、Linux ターミナルとして画面の右側にある Azure Cloud Shell を使用します。 Azure Cloud Shell は、Azure portal または https://shell.azure.com でアクセスできるシェルです。 お使いのコンピューターに何もインストールしなくても使用できます。
この演習では、Try/Catch
ブロックを使用して、特定の条件が満たされない場合にスクリプトが早期に応答しなくなるようにします。 もう一度バックアップ スクリプトを操作します。
誤ったパスを指定したために、バックアップする必要のないファイルのバックアップが生成されたことがあるとわかっているとします。 いくつかのエラー管理を追加することにしました。
注
このモジュールの前の演習を完了していない場合 にのみ 、次のコマンドを実行します。 これまでの演習を完了していることを前提としています。 まだ終わっていない場合は、いくつかのファイルが必要です。
このモジュールのこれまでの演習を完了していない場合は、次の bash コマンドをターミナルで実行します。
mkdir webapp cd webapp touch index.html app.js cd ..
これらのコマンドにより、通常、Web 開発に関連付けられているファイルを含むディレクトリが作成されます。
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 アプリを認識するようにスクリプトを最適化することにします。
既存の PowerShell シェルを実行している場合は、これを使用します。 それ以外の場合は、ターミナルで「
pwsh
」と入力して起動します。pwsh
Backup.ps1を開きます。
Param
セクションで、最後のパラメーターの後にコンマを追加し、次のパラメーターを追加します。[switch]$PathIsWebApp
switch パラメーターを追加しました。 スクリプトが呼び出されたときにこのパラメーターが存在する場合は、コンテンツのチェックを実行します。 その後、バックアップ ファイルを作成する必要があるかどうかを判断できます。
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
ブロックでキャッチされます。 スクリプトは停止され、改善したエラー メッセージでエラーを再スローします。
スイッチ
$PathIsWebApp
を指定してスクリプトをテストします。注
スクリプトを実行する前に、.zip ファイルが存在しないことを確認します。 これらは、このモジュールのこれまでの演習を完了したときに作成されている可能性があります。
Remove-Item *zip
を使用して削除します。./Backup.ps1 -PathIsWebApp -Path './webapp'
スクリプトにより、次のテキストのように出力されます。
Source files looks good, continuing Created backup at ./backup-2021-12-30.zip
ターミナルを使用して、 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
PowerShell シェルでスクリプトをもう一度実行します。今回は、
-Path
をポイントするように./python-app
値を変更します。./Backup.ps1 -PathIsWebApp -Path './python-app'
スクリプトにより次のテキストが出力されます。
No backup created due to: Not a web app
この出力は、チェックが失敗したことを示しています。 ディレクトリに .html、.js、または .css 拡張子の付いたファイルが存在しないためにこのようになりました。 コードにより、
Catch
ブロックでキャッチされた例外が発生し、スクリプトは早期に停止しました。おめでとうございます。 ビジネス要件の実装が終わりました。