練習 - 錯誤處理

已完成

在此練習中,您將使用 Try/Catch 區塊,以確保指令碼會在特定條件不符合時提早停止回應。 您將會再次使用您的備份指令碼。

假設您已注意到,有時會指定錯誤的路徑,而導致備份不應備份的檔案。 您決定新增一些錯誤管理。

注意

此練習為選擇性項目。 如果您想要完成此練習,您必須先建立 Azure 訂用帳戶,才能開始。 如果您沒有 Azure 帳戶,或目前不想建立帳戶,您可以閱讀指示,以便瞭解所呈現的資訊。

注意

在本單元中,您會使用 Azure Cloud Shell 作為終端機。 您可以透過 Azure 入口網站Cloud Shell 登入來存取 Cloud Shell。 您無需在 PC 或筆記本電腦上安裝任何東西即可使用它。

注意

「只」有在未完成此課程模組中的任何先前練習時,才會執行下列命令。 我們假設您已完成先前的練習。 如果您尚未這麼做,您需要幾個檔案。

  1. 如果您尚未在此課程模組中完成先前的練習,請在終端機中執行下列的 Bash 命令:

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

    這些命令會建立一個目錄,其中包含通常與網頁程式開發相關聯的檔案。

  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 shell,請使用現有的 PowerShell shell。 否則,請在終端機中輸入 pwsh 來開始:

    pwsh
    
  2. 開啟「Backup.ps1」。 在 Param 區段中,於最後一個參數後面加上逗號,然後新增下列參數:

    [switch]$PathIsWebApp
    

    您已新增「切換參數」。 如果叫用指令碼時出現此參數,您可以針對內容執行檢查。 之後,您可以判斷是否應該建立備份檔案。

  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 變數是否為 TrueFalse。 此時,程式碼可以採用兩個路徑:

    • 如果來源目錄適用於 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 區塊攔截到的例外狀況,且指令碼提早停止。

    恭喜! 您已實作商務需求。