پاورشل برای برنامهنویسان
@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 بشن
✨ تمرین پیشنهادی:
- تابعی بنویس که دو عدد بگیره و تقسیمشون کنه؛ اگر تقسیم بر صفر بود، با
throwخطا بده. - تابعی بساز که یه فایل بخونه و اگر وجود نداشت، خطا رو بگیره و پیام مناسب چاپ کنه.
- تمرین حرفهایتر: تابعی بساز که یه فایل JSON رو بخونه و اگر ساختار JSON اشتباه بود، در
catchپیغام واضح بده.