練習 - 錯誤處理
在此練習中,您將使用 Try/Catch 區塊,以確保指令碼會在特定條件不符合時提早停止回應。 您將會再次使用您的備份指令碼。
假設您已注意到,有時會指定錯誤的路徑,而導致備份不應備份的檔案。 您決定新增一些錯誤管理。
注意
此練習為選擇性項目。 如果您想要完成此練習,您必須先建立 Azure 訂用帳戶,才能開始。 如果您沒有 Azure 帳戶,或目前不想建立帳戶,您可以閱讀指示,以便瞭解所呈現的資訊。
注意
在本單元中,您會使用 Azure Cloud Shell 作為終端機。 您可以透過 Azure 入口網站 或 Cloud Shell 登入來存取 Cloud Shell。 您無需在 PC 或筆記本電腦上安裝任何東西即可使用它。
注意
「只」有在未完成此課程模組中的任何先前練習時,才會執行下列命令。 我們假設您已完成先前的練習。 如果您尚未這麼做,您需要幾個檔案。
如果您尚未在此課程模組中完成先前的練習,請在終端機中執行下列的 Bash 命令:
mkdir webapp cd webapp touch index.html app.js cd ..這些命令會建立一個目錄,其中包含通常與網頁程式開發相關聯的檔案。
您也需要一個名為「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 shell,請使用現有的 PowerShell shell。 否則,請在終端機中輸入
pwsh來開始:pwsh開啟「Backup.ps1」。 在
Param區段中,於最後一個參數後面加上逗號,然後新增下列參數:[switch]$PathIsWebApp您已新增「切換參數」。 如果叫用指令碼時出現此參數,您可以針對內容執行檢查。 之後,您可以判斷是否應該建立備份檔案。
在
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。 此時,程式碼可以採用兩個路徑:- 如果來源目錄適用於 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區塊攔截到的例外狀況,且指令碼提早停止。恭喜! 您已實作商務需求。