پاورشل برای برنامه‌نویسان

پاورشل برای برنامه‌نویسان

@programming_tips

درسنامه: Return values و Error Handling

درس امروز دو بخش داره:

۱. Return values (مقادیر بازگشتی)

۲. Error Handling (مدیریت خطا)


۱. Return Values — برگرداندن خروجی از توابع

هر تابع در PowerShell می‌تونه خروجی تولید کنه، چه با استفاده از return، چه با ساده‌ترین دستور Write-Output.

خروجی خودکار

در پاورشل، هر چیزی که داخل تابع چاپ بشه (مثلاً با Write-Output یا حتی بدون اون)، به‌صورت خودکار به عنوان مقدار بازگشتی برمی‌گرده:

function Get-Sum {
    $a = 5
    $b = 10
    $a + $b  # این خودش خروجی تابع محسوب میشه
}

$result = Get-Sum
Write-Output "Result: $result"

اینجا مقدار 15 به صورت خودکار به $result برمی‌گرده، حتی بدون استفاده از return.


استفاده از دستور return

اگر بخوای اجرای تابع رو در نقطه‌ای متوقف کنی و مقدار مشخصی برگردونی، از return استفاده می‌کنی:

function Divide {
    param([int]$a, [int]$b)
    if ($b -eq 0) {
        Write-Output "Division by zero!"
        return
    }
    return ($a / $b)
}

$result = Divide -a 10 -b 2
Write-Output "Result: $result"

در این مثال اگر $b برابر صفر باشه، تابع پیغام خطا میده و برمی‌گرده بدون انجام تقسیم.


برگرداندن چند مقدار

در PowerShell، تابع‌ها می‌تونن چند مقدار مختلف رو همزمان برگردونن.

مقادیر به صورت آرایه برمی‌گردن:

function Get-Info {
    $name = "Ali"
    $age = 27
    return $name, $age
}

$data = Get-Info
Write-Output "Name: $($data[0]), Age: $($data[1])"

اینجا خروجی تابع یک آرایه شامل دو مقدار است.


۲. Error Handling — مدیریت خطاها

در هر زبان برنامه‌نویسی، وقتی خطایی رخ می‌ده باید راهی برای کنترلش وجود داشته باشه تا برنامه از کار نیفته.

در پاورشل این کار با Try / Catch / Finally انجام میشه.


ساختار try / catch

try {
    # دستورات خطرناک
    $result = 10 / 0
}
catch {
    # وقتی خطا رخ میده
    Write-Output "An error occurred: $_"
}

در این مثال چون تقسیم بر صفر خطاست، کنترل به بخش catch منتقل میشه و $_.Exception.Message یا به طور خلاصه $_ شامل پیام خطاست.


افزودن بخش finally

بخش finally همیشه اجرا میشه، چه خطا رخ بده چه نه. معمولاً برای پاک‌سازی یا بستن منابع استفاده میشه.

try {
    $file = Get-Content "data.txt"
    Write-Output "File read successfully"
}
catch {
    Write-Output "File not found"
}
finally {
    Write-Output "Operation finished"
}

حتی اگر فایل وجود نداشته باشه، finally در انتها اجرا میشه.


فعال کردن خطاهای واقعی (terminating errors)

به طور پیش‌فرض، بعضی خطاها در PowerShell غیر متوقف‌کننده (non-terminating) هستن، یعنی برنامه ادامه پیدا می‌کنه.

برای اینکه catch اون‌ها رو بگیره باید -ErrorAction Stop استفاده کنی:

try {
    Get-Content "nofile.txt" -ErrorAction Stop
}
catch {
    Write-Output "Caught error: $_"
}

بدون -ErrorAction Stop، پاورشل فقط هشدار میده ولی به catch نمی‌ره.


ساختن خطای دلخواه (Throw)

خودت هم می‌تونی با throw خطا ایجاد کنی:

function Divide-Safe {
    param($a, $b)
    if ($b -eq 0) {
        throw "Cannot divide by zero"
    }
    return ($a / $b)
}

try {
    Divide-Safe -a 5 -b 0
}
catch {
    Write-Output "Error: $_"
}

اینجا اگر کاربر بخواد تقسیم بر صفر انجام بده، تابع خودش خطا پرتاب می‌کنه و catch اون رو می‌گیره.


۳. نکات حرفه‌ای در Error Handling

  • از Write-Error برای نمایش خطا بدون توقف برنامه استفاده کن.
  • از Throw برای متوقف کردن اجرای تابع در شرایط خاص استفاده کن.
  • متغیر خودکار $Error در PowerShell شامل لیستی از خطاهای اخیر هست.
  • می‌تونی با $Error[0] آخرین خطا رو ببینی.
  • اگر چند catch داشته باشی، می‌تونی برای هر نوع خطا رفتار خاصی تعریف کنی:
try {
    [int]"abc"
}
catch [FormatException] {
    Write-Output "Invalid format!"
}
catch {
    Write-Output "Unknown error"
}

۴. جمع‌بندی

✅ تابع‌ها می‌تونن مقدار بازگشتی داشته باشن (به‌صورت خودکار یا با return)

✅ با try/catch/finally می‌تونی خطاها رو کنترل و برنامه‌ات رو پایدار نگه داری

✅ با throw می‌تونی خطاهای اختصاصی بسازی

-ErrorAction Stop باعث میشه خطاها قابل کنترل در catch بشن


تمرین پیشنهادی:

  1. تابعی بنویس که دو عدد بگیره و تقسیمشون کنه؛ اگر تقسیم بر صفر بود، با throw خطا بده.
  2. تابعی بساز که یه فایل بخونه و اگر وجود نداشت، خطا رو بگیره و پیام مناسب چاپ کنه.
  3. تمرین حرفه‌ای‌تر: تابعی بساز که یه فایل JSON رو بخونه و اگر ساختار JSON اشتباه بود، در catch پیغام واضح بده.

Report Page