Упражнение. Обработка ошибок

Завершено

На этом уроке в качестве терминала Linux необходимо использовать Azure Cloud Shell в правой части экрана. Azure Cloud Shell — это оболочка, к которой можно получить доступ на портале Azure или по адресу https://shell.azure.com. Чтобы ее использовать, не нужно ничего устанавливать на ваш компьютер.

В этом упражнении вам нужно использовать блок Try/Catch, чтобы сценарий перестал отвечать на запросы как можно раньше, если не будет выполнено определенное условие. Вы снова будете работать со сценарием резервного копирования.

Предположим, вы заметили, что иногда некорректно указывается путь, в результате чего выполняется резервное копирование других файлов. Вы решили добавить некоторые средства управления ошибками.

Примечание.

Выполняйте следующие команды, только если вы не выполнили ни одного из предыдущих упражнений в этом модуле. Предполагается, что вы выполнили предыдущие упражнения. В противном случае вам потребуется несколько файлов.

  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

Предположим, что компания занимается разработкой веб-приложений. Эти приложения состоят из файлов HTML, CSS и JavaScript. Вы решили оптимизировать сценарий для распознавания веб-приложений.

  1. Используйте существующую оболочку PowerShell, если она запущена. В противном случае запустите ее, введя 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 значение True или False. На этом этапе код может выполняться двумя способами:

    • Если исходный каталог предназначен для веб-приложения, сценарий записывает "исходные файлы корректны, продолжение выполнения".
    • Если исходный каталог не предназначен для веб-приложения, сценарий выводит ошибку с уведомлением: "Не является веб-приложением". Ошибка перехватывается в блоке 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, и выполнение сценария быстро остановилось.

    Поздравляем! Вы реализовали коммерческое требование.