SORU
15 ŞUBAT 2012, ÇARŞAMBA


Ne zaman Yazma Hatası kullanın vs Atmak gerekir?

PoshCode üzerine Olsun-WebFile bir senaryo bakıyor: http://poshcode.org/3226 Garip-beni bu mekanizma fark ettim:

$URL_Format_Error = [string]"..."
Write-Error $URL_Format_Error
return

Aksine: bunun nedeni nedir

$URL_Format_Error = [string]"..."
Throw $URL_Format_Error

hatta daha iyi:

$URL_Format_Error = New-Object System.FormatException "..."
Throw $URL_Format_Error

Anladığım kadarıyla Yazma Hatası Dönüş takip kullanmamalısınız bana öyle geliyor ki, bu yüzden non-sonlandırma hataları için Yazma Hatası kullanın ve sonlandırma hataları için Atmak gerekir. Bir fark var mı?

CEVAP
15 ŞUBAT 2012, ÇARŞAMBA


Write-Error eğer kritik olmayan bir hata kullanıcıyı bilgilendirmek için kullanılır. Varsayılan olarak yaptığı Tüm konsol üzerinde kırmızı metin bir hata mesajı yazdırmak. Bir boru ya da devam eden bir döngü durmuyor. Diğer yandan Throw sonlandırıcı bir hata ne denir üretir. Eğer atmak kullanırsanız, boru hattı ve/veya geçerli döngü sonlandırılır. Aslında tüm yürütme trap Bir veya sonlandırıcı hata işlemek için try/catch bir yapı kullandığınız sürece iptal edilecektir. Unutulmaması gereken bir şey var, "Stop" $ErrorActionPreference set Write-Error kullanın sonlandırıcı bir hata üretecektir.

Script bu biz bulmak için size bağlı:

if ($url.Contains("http")) {
    $request = [System.Net.HttpWebRequest]::Create($url)
} 
else {  
    $URL_Format_Error = [string]"Connection protocol not specified. Recommended action: Try again using protocol (for example 'http://"   $url   "') instead. Function aborting..."
    Write-Error $URL_Format_Error
    return
}

Bu fonksiyon yazarı bu görevi yürütmeyi durdurma ve ekranda bir hata iletisi görüntülemek için istemiş gibi görünüyor ama tüm komut dosyası yürütme durdurmak istemiyordu. Senaryo yazarı throw ancak işlevi çağrılırken try/catch kullanmak gerekir anlamına gelir.

return bir işlevi, komut ya da komut bloğu olabilir, geçerli kapsam çıkılacak. Bu iyi bir kod ile gösterilmiştir:

# A foreach loop.
foreach ( $i in  (1..10) ) { Write-Host $i ; if ($i -eq 5) { return } }

# A for loop.
for ($i = 0; $i -le 10; $i  ) { Write-Host $i ; if ($i -eq 5) { return } }

Her ikisi için de çıkış

1
2
3
4
5

Bir tane yakaladım burada ForEach-Object return kullanıyor. Tahmin edebileceğiniz gibi işleme kırılmaz.

Daha fazla bilgi:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alexis gillis

    alexis gilli

    23 HAZİRAN 2011
  • Ownage Pranks

    Ownage Prank

    13 AĞUSTOS 2007
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008