Упражнение. Обработка ошибок
На этом уроке в качестве терминала Linux необходимо использовать Azure Cloud Shell в правой части экрана. Azure Cloud Shell — это оболочка, к которой можно получить доступ на портале Azure или по адресу https://shell.azure.com. Чтобы ее использовать, не нужно ничего устанавливать на ваш компьютер.
В этом упражнении вам нужно использовать блок Try/Catch
, чтобы сценарий перестал отвечать на запросы как можно раньше, если не будет выполнено определенное условие. Вы снова будете работать со сценарием резервного копирования.
Предположим, вы заметили, что иногда некорректно указывается путь, в результате чего выполняется резервное копирование других файлов. Вы решили добавить некоторые средства управления ошибками.
Примечание.
Выполняйте следующие команды, только если вы не выполнили ни одного из предыдущих упражнений в этом модуле. Предполагается, что вы выполнили предыдущие упражнения. В противном случае вам потребуется несколько файлов.
Если вы еще не выполнили предыдущие упражнения в этом модуле, выполните в терминале следующие команды 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
Предположим, что компания занимается разработкой веб-приложений. Эти приложения состоят из файлов HTML, CSS и JavaScript. Вы решили оптимизировать сценарий для распознавания веб-приложений.
Используйте существующую оболочку PowerShell, если она запущена. В противном случае запустите ее, введя
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
. На этом этапе код может выполняться двумя способами:- Если исходный каталог предназначен для веб-приложения, сценарий записывает "исходные файлы корректны, продолжение выполнения".
-
Если исходный каталог не предназначен для веб-приложения, сценарий выводит ошибку с уведомлением: "Не является веб-приложением". Ошибка перехватывается в блоке
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
, и выполнение сценария быстро остановилось.Поздравляем! Вы реализовали коммерческое требование.