تمرين - معالجة الأخطاء

مكتمل

في هذا التمرين، ستستخدم الكتلة Try/Catch لضمان توقف البرنامج النصي عن الاستجابة مبكرًا في حالة عدم استيفاء شرط معين. ستعمل مرةً أخرى مع النسخة الاحتياطية من برنامجك النصي.

لنفترض أنك لاحظت أنك في بعض الأحيان تحدد مسارًا خاطئًا، مما يؤدي إلى إنشاء نسخ احتياطي للملفات التي لا ينبغي نسخها احتياطيًا. قررت إضافة شيئًا ما من إدارة الأخطاء.

إشعار

هذا التمرين اختياري. إذا كنت ترغب في إكمال هذا التمرين، فستحتاج إلى إنشاء اشتراك Azure قبل البدء. إذا لم يكن لديك حساب Azure أو كنت لا ترغب في إنشاء حساب في الوقت الحالي، فيمكنك قراءة الإرشادات حتى تفهم المعلومات التي يتم تقديمها.

إشعار

في هذه الوحدة، يمكنك استخدام Azure Cloud Shell كمحطة طرفية. يمكنك الوصول إلى Cloud Shell من خلال مدخل Microsoft Azure أو تسجيل الدخول إلى Cloud Shell. لست مضطرا لتثبيت أي شيء على جهاز الكمبيوتر أو الكمبيوتر المحمول لاستخدامه.

إشعار

شغَّل الأوامر التالية فقط إذا لم تكن قد أكملت أياً من التمارين السابقة في هذه الوحدة. نفترض أنك أكملت التمارين السابقة. إذا لم تكن قد أكملتها، فقد تحتاج إلى عدد قليل من الملفات.

  1. إذا لم تكن قد أكملت التمارين السابقة في هذه الوحدة، فشغَّل الأوامر التالية في نافذة طرفية:

    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 مما إذا كان المتغير $ContainsApplicationFilesTrue أم False. عند هذه النقطة، يمكن أن تأخذ التعليمات البرمجية مسارين:

    • إذا كان الدليل المصدر لتطبيق ويب، يكتب البرنامج النصي "Source files look good, continuing".
    • إذا لم يكن الدليل المصدر لتطبيق ويب، يطرح البرنامج النصي خطأ ينص على "Not a web app." تم تسجيل الخطأ في الكتلة 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 shell، شغَّل البرنامج النصي مرةً أخرى، ولكن هذه المرة، قم بتغيير القيمة -Path للإشارة إلى ./python-app:

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

    يجب أن يطبع برنامجك النصي الآن هذا النص:

    No backup created due to: Not a web app
    

    يشير الإخراج إلى فشل الفحص. يجب أن يكون قد فعل، لأنه لا توجد ملفات في الدليل الذي يحتوي على ملحق اسم ملف .html أو .js أو .css. أثارت تعليماتك البرمجية استثناء اكتشفته الكتلة Catch خاصتك، وتوقف البرنامج النصي في وقت مبكر.

    تهانينا! لقد نفذت أحد متطلبات العمل.