Ejercicio: Control de errores

Completado

En este ejercicio, usará un bloque Try/Catch para asegurarse de que el script deja de responder pronto si no se cumple una condición determinada. Para ello, volverá a trabajar con el script de copia de seguridad.

Supongamos que ha observado que a veces especifica una ruta de acceso errónea, lo que hace que se realice una copia de seguridad de archivos a los que no les corresponde. Decide agregar la administración de errores.

Nota

Este ejercicio es opcional. Si desea completar este ejercicio, deberá crear una suscripción de Azure antes de comenzar. Si no tiene una cuenta de Azure o no quiere crear una en este momento, puede leer las instrucciones para que comprenda la información que se presenta.

Nota

En esta unidad, usará Azure Cloud Shell como terminal. Puede acceder a Cloud Shell mediante Azure Portal o el inicio de sesión de Cloud Shell. No tienes que instalar nada en tu PC o portátil para usarlo.

Nota

Ejecute los comandos siguientes solo si no ha completado ninguno de los ejercicios anteriores de este módulo. Vamos a suponer que ha completado los ejercicios anteriores. Si no lo ha hecho, necesitará algunos archivos.

  1. Si no ha completado los ejercicios anteriores de este módulo, ejecute los comandos siguientes de bash en un terminal:

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

    Estos comandos crearán un directorio que contiene archivos que suelen asociarse al desarrollo web.

  2. También necesita un archivo denominado Backup.ps1. Ejecute estos comandos:

    touch Backup.ps1
    code Backup.ps1
    

    Ahora que tiene un editor en ejecución, agregue el código necesario. Pegue este código en el editor y guarde el archivo:

    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"
    }
    

Implementación de un requisito empresarial mediante Try/Catch

Supongamos que su empresa se dedica principalmente a compilar aplicaciones web. Estas aplicaciones constan de archivos HTML, CSS y JavaScript. Decide optimizar el script para que reconozca aplicaciones web.

  1. Use un shell de PowerShell existente, si tiene uno en ejecución. De lo contrario, escriba pwsh en un terminal para iniciar uno:

    pwsh
    
  2. Abra Backup.ps1. En la sección Param, agregue una coma después del último parámetro y, a continuación, agregue el parámetro siguiente:

    [switch]$PathIsWebApp
    

    Ha agregado un parámetro de modificador. Si este parámetro está presente cuando se invoca el script, se realiza la comprobación en el contenido. Después, puede determinar si se debe crear un archivo de copia de seguridad.

  3. En la sección Param, agregue este código y guarde el archivo:

    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)"
       }
    }
    

    El código anterior comprueba primero si el parámetro $PathIsWebApp se proporciona en tiempo de ejecución. Si es así, el código continúa y obtiene una lista de extensiones de archivo del directorio que se especifica mediante $Path. En este caso, si ejecuta esa parte del código en el directorio webapp, el código siguiente imprimirá una lista de elementos:

    (Get-ChildItem $Path).Extension | Sort-Object -Unique
    

    Este es el resultado:

    .html
    .js
    

    En la instrucción completa, se usa el operador -match. El operador -match espera un patrón de expresión regular. En este caso, la expresión indica lo siguiente: "¿Coincide alguna de las extensiones de archivo con .html, .js o .css?". El resultado de la instrucción se guarda en la variable $ContainsApplicationFiles.

    Después, el bloque If comprueba si la variable $ContainsApplicationFiles es True o False. En este punto, el código puede tomar dos rutas de acceso:

    • Si el directorio de origen es para una aplicación web, el script escribe: "Source files look good, continuing" (Los archivos de código fuente son correctos. Continuando.).
    • Si el directorio de origen no es para una aplicación web, el script produce un error que indica: "Not a web app" (No es una aplicación web). El error se captura en un bloque Catch. El script se detiene y se vuelve a generar el error con un mensaje de error mejorado.
  4. Proporcione el modificador $PathIsWebApp para probar el script:

    Nota

    Antes de ejecutar el script, asegúrese de que no haya ningún archivo ZIP. Es posible que se hayan creado al completar ejercicios anteriores de este módulo. Use Remove-Item *zip para quitarlos.

    ./Backup.ps1 -PathIsWebApp -Path './webapp'
    

    El script debería imprimir una salida similar a este texto:

    Source files looks good, continuing
    Created backup at ./backup-2021-12-30.zip
    
  5. Con el terminal, cree un directorio denominado python-app. En el nuevo directorio, cree un archivo denominado script.py:

    mkdir python-app
    cd python-app
    touch script.py
    cd ..
    

    Ahora el aspecto del directorio debería ser así:

    -| webapp/
    ---| app.js
    ---| index.html
    -| python-app/
    ---| script.py
    -| Backup.ps1
    
  6. En el shell de PowerShell, vuelva a ejecutar el script, pero esta vez cambie el valor -Path para que apunte a ./python-app:

    ./Backup.ps1 -PathIsWebApp -Path './python-app'
    

    Ahora el script debería imprimir este texto:

    No backup created due to: Not a web app
    

    La salida indica que no se pudo realizar la comprobación. Esto es correcto, ya que no hay ningún archivo en el directorio que tenga una extensión .html, .js o .css. El código produjo una excepción que se capturó mediante el bloque Catch y el script se detuvo pronto.

    Enhorabuena. Ha implementado un requisito empresarial.