Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kısa açıklama
Sonlandırıcı bir hatayı işleyen bir anahtar sözcüğü açıklar.
Uzun açıklama
Sonlandırma hatası bir deyimin çalışmasını durdurur. PowerShell bir sonlandırma hatasını bir şekilde işlemezse, PowerShell geçerli işlem hattında işlevi veya betiği çalıştırmayı da durdurur. C# gibi diğer dillerde sonlandırma hataları özel durumlar olarak bilinir.
trap anahtar sözcüğü, sonlandırıcı bir hata oluştuğunda çalıştırılacak deyimlerin listesini belirtir.
trap ifadeleri, sonlandırma hatalarını aşağıdaki yollarla işleyebilir:
trapdeyimi bloğunu işledikten vetrapiçeren betiğin veya işlevin yürütülmesine devam ettikten sonra hatayı görüntüleyin. Bu, varsayılan davranıştır.Uyarı
ifdeyimi veyaforeachdöngüsü gibi bir alt betik bloğunda sonlandırma hatası oluştuğunda,trapbloğundaki deyimler çalıştırılır ve alt betik bloğunun dışındaki bir sonraki deyimde yürütme devam eder.trapiçeren betiğin veya işlevin yürütülmesini,breakdeyimindekitrapkullanarak hatayı görüntüleyip yürütmeyi durdurarak sonlandırın.Hatayı susturun, ancak
trapdeyimindekicontinuekullanaraktrapiçeren betiğin veya işlevin yürütülmesine devam edin.
trap deyim listesi birden çok koşul veya işlev çağrısı içerebilir. bir trap günlükleri yazabilir, koşulları test edebilir ve hatta başka bir program çalıştırabilir.
Sözdizimi
trap deyimi aşağıdaki söz dizimine sahiptir:
trap [[<error type>]] {<statement list>}
trap deyimi, sonlandırıcı bir hata oluştuğunda çalıştırılacak deyimlerin listesini içerir.
trap deyimi, trap anahtar kelimesi, isteğe bağlı olarak bir tür ifadesi ve bir hata yakalandığında çalıştırılacak deyimler listesini içeren deyim bloğundan oluşur. Tür ifadesi, trap yakaladığı hata türlerini iyileştirmektedir.
Bir betik veya komut birden çok trap deyimine sahip olabilir.
trap deyimleri betikte veya komutta herhangi bir yerde görünebilir.
Sonlandırma hatalarını yakalama
Bir betik veya komutta başka bir şekilde işlenmeyen bir sonlandırma hatası oluştuğunda, PowerShell hatayı işleyen bir trap deyim olup olmadığını denetler. bir trap deyimi varsa PowerShell, trap deyiminde betiği veya komutu çalıştırmaya devam eder.
Aşağıdaki örnek çok basit trap bir ifadedir:
trap {"Error found."}
Bu trap deyimi, sonlandırıcı hataları yakalar.
Aşağıdaki örnekte işlev, çalışma zamanı hatasına neden olan saçma bir dize içerir.
function TrapTest {
trap {"Error found."}
nonsenseString
}
TrapTest
Bu işlevi çalıştırmak aşağıdakileri döndürür:
Error found.
nonsenseString:
Line |
3 | nonsenseString
| ~~~~~~~~~~~~~~
| The term 'nonsenseString' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name, or
if a path was included, verify that the path is correct and try again.
Aşağıdaki örnek, trap otomatik değişkenini kullanarak hatayı görüntüleyen bir $_ deyimini içerir:
function TrapTest {
trap {"Error found: $_"}
nonsenseString
}
TrapTest
İşlevin bu sürümünü çalıştırmak aşağıdakileri döndürür:
Error found: The term 'nonsenseString' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of the
name, or if a path was included, verify that the path is correct and try again.
nonsenseString:
Line |
3 | nonsenseString
| ~~~~~~~~~~~~~~
| The term 'nonsenseString' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name, or
if a path was included, verify that the path is correct and try again.
Önemli
trap İfadeler belirli bir kapsam içinde herhangi bir yerde tanımlanabilir, ancak her zaman bu kapsamdaki tüm deyimler için geçerlidir. Çalışma zamanında, bir bloktaki trap deyimleri, diğer tüm deyimler yürütülmeden önce belirlenir. JavaScript'te bu, hoisting olarak bilinir. Bu, deyimlerin, trap yürütme tanımlandıkları noktayı geçmemiş olsa bile o bloktaki tüm deyimler için geçerli olduğu anlamına gelir. Örneğin, betiğin sonunda bir trap tanımlamak ve ilk deyimde bir hata fırlatmak yine de trap'i tetikler.
Belirli hataları yakalama
Bir betik veya komut birden çok trap deyimine sahip olabilir. Belirli hataları işlemek için bir trap tanımlanabilir.
Aşağıdaki örnek, belirli bir trap'ı yakalayan deyimidir:
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
Bir işlev veya komut dosyası, bilinen bir komutla eşleşmeyen bir dizeyle karşılaştığında, bu trap deyim "Komut hatası yakalandı" dizesini görüntüler.
trap deyimi listesini çalıştırdıktan sonra PowerShell hata nesnesini hata akışına yazar ve ardından betiği çalıştırmaya devam eder.
PowerShell .NET özel durum türlerini kullanır. Aşağıdaki örnek system.exception hata türünü belirtir:
trap [System.Exception] {"An error trapped"}
CommandNotFoundException hata türü, System.Exception türünden devralınır. Bu deyim, bilinmeyen bir komut tarafından oluşturulan bir hatayı yakalar. Ayrıca diğer hata türlerini de yakalar.
Betikte birden fazla trap deyimi olabilir. Her hata türü yalnızca bir trap deyim tarafından yakalanabilir. Bir sonlandırma hatası oluştuğunda PowerShell, geçerli yürütme kapsamından başlayarak en belirgin eşleşmeyi arar trap .
Aşağıdaki betik örneği bir hata içeriyor. Betik, sonlandırıcı hataları yakalar genel bir trap deyimi ve trap türünü belirten belirli bir deyimi içerir.
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {
"Command error trapped"
}
nonsenseString
Bu betiği çalıştırmak aşağıdaki sonucu verir:
Command error trapped
nonsenseString:
Line |
5 | nonsenseString
| ~~~~~~~~~~~~~~
| The term 'nonsenseString' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name, or
if a path was included, verify that the path is correct and try again.
PowerShell "nonsenseString" öğesini cmdlet veya başka bir öğe olarak tanımadığından, bir CommandNotFoundException hatası döndürür. Bu sonlandırma hatası, belirli trap bir deyim tarafından yakalanır.
Aşağıdaki betik örneği, farklı bir hatayla aynı trap deyimlerini içerir:
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
1/$null
Bu betiği çalıştırmak aşağıdaki sonucu verir:
Other terminating error trapped
RuntimeException:
Line |
4 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
Sıfıra bölme girişimi bir CommandNotFoundException hatası oluşturmaz. Bunun yerine, bu hata, herhangi bir sonlandırma hatasını yakalayan diğer trap deyim tarafından yakalanır.
Betik bloğunda hataları yakalama
Varsayılan olarak, bir sonlandırma hatası oluşturulduğunda, yürütme yakalama deyimine aktarılır.
trap bloğu çalıştırıldıktan sonra denetim, hatanın konumundan sonraki deyim bloğuna döner.
Örneğin, bir foreach deyiminde sonlandırma hatası oluştuğunda, trap deyimi çalıştırılır ve yürütme foreach bloğunda değil, foreach bloğundan sonraki deyimde devam eder.
trap { 'An error occurred!'}
foreach ($x in 3..0) {
1/$x
'after division'
}
'after loop'
0.333333333333333
after division
0.5
after division
1
after division
An error occurred!
RuntimeException: untitled:Untitled-1:3:4
Line |
3 | 1/$x
| ~~~~
| Attempted to divide by zero.
after loop
Yukarıdaki çıktıda, döngülerin son yinelemeye kadar devam ettiğini görebilirsiniz.
Komut dosyası 1'i 0'a bölmeye çalıştığında bir sonlandırma hatası atılır. Komut dosyası bloğunun foreach geri kalanı atlanır, try deyim çalıştırılır ve komut dosyası, komut dosyası bloğundan sonra devam eder foreach .
Yakalama hataları ve kapsamı
Deyimle trap aynı kapsamda bir sonlandırma hatası oluşursa, PowerShell tarafından traptanımlanan deyimlerin listesini çalıştırır. Yürütme, hatadan sonraki ifadede devam eder.
trap Deyim hatadan farklı bir kapsamdaysa, yürütme deyimle aynı kapsamda olan bir sonraki deyimde devam edertrap.
Örneğin, bir işlevde hata oluşursa ve trap deyimi işlevdeyse, betik sonraki deyimde devam eder. Aşağıdaki betik bir hata ve trap ifadesi içerir.
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
function1
Bu betiği çalıştırmak aşağıdaki sonucu verir:
An error:
NonsenseString:
Line |
3 | NonsenseString
| ~~~~~~~~~~~~~~
| The term 'NonsenseString' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name, or
if a path was included, verify that the path is correct and try again.
function1 was completed
Fonksiyondaki trap deyimi hatayı tutar. İletiyi görüntüledikten sonra PowerShell işlevi çalıştırmaya devam eder. Tamamlandığını Function1 unutmayın.
Bunu, aynı hataya ve trap ifadeye sahip olan aşağıdaki örnekle karşılaştırın. Bu örnekte, trap deyimi işlevin dışında gerçekleşir:
function function2 {
NonsenseString
"function2 was completed"
}
trap { "An error: " }
function2
Function2 işlevini çalıştırmak aşağıdaki sonucu verir:
An error:
NonsenseString:
Line |
2 | NonsenseString
| ~~~~~~~~~~~~~~
| The term 'NonsenseString' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name, or
if a path was included, verify that the path is correct and try again.
Bu örnekte, "function2 was completed" komutu çalıştırılmadı. Her iki örnekte de sonlandırma hatası işlevinde oluşur. Ancak bu örnekte trap deyimi işlevin dışındadır. PowerShell, deyim çalıştırıldıktan sonra trap işleve geri dönmez.
Dikkat
Aynı hata koşulu için birden çok tuzak tanımlandığında, sözcüksel olarak tanımlanan ilk trap tuzak (kapsamdaki en yüksek) kullanılır.
Aşağıdaki örnekte, yalnızca trap "whoops 1" ile çalıştırılır.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
Önemli
Bir Trap deyiminin kapsamı, derlendiği yere göre belirlenir. İşlevin veya nokta kaynaklı betiğin içinde trap deyiminiz varsa, işlev veya nokta kaynaklı betik çıktığında içindeki tüm trap deyimleri kaldırılır.
Break ve continue anahtar sözcüklerini kullanma
break deyiminde continue ve trap anahtar sözcüklerini kullanarak bir betiğin veya komutun sonlandırıcı bir hatadan sonra çalışmaya devam edip etmediğini belirleyebilirsiniz.
break ifade listesine bir trap ifadesi eklerseniz, PowerShell işlevi veya betiği durdurur. Aşağıdaki örnek işlev, break deyiminde trap anahtar sözcüğünü kullanır:
function break_example {
trap {
"Error trapped"
break
}
1/$null
"Function completed."
}
break_example
Error trapped
ParentContainsErrorRecordException:
Line |
6 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
trap Deyim anahtar sözcüğü içerdiğindenbreak, işlev çalışmaya devam etmez ve "İşlev tamamlandı" satırı çalıştırılmaz.
continue deyimine trap anahtar sözcüğü eklerseniz PowerShell, hataya neden olan deyiminden sonra break veya continueolmadan olduğu gibi devam eder. Ancak anahtar sözcüğüyle continue PowerShell hata akışına bir hata yazmaz.
Aşağıdaki örnek işlev, continue deyiminde trap anahtar sözcüğünü kullanır:
function continue_example {
trap {
"Error trapped"
continue
}
1/$null
"Function completed."
}
continue_example
Error trapped
Function completed.
Hata yakalandıktan sonra işlev devam eder ve "İşlev tamamlandı" deyimi çalışır. Hata akışına hiçbir hata yazılmadı.
Notlar
trap deyimler, bir kapsam içindeki tüm sonlandırma hatalarının işlendiğinden emin olmak için basit bir yol sağlar. Daha ayrıntılı hata işleme için, tuzakların try deyimleri kullanılarak tanımlandığı /catchcatch blokları kullanın.
catch deyimleri yalnızca ilişkili try deyimi içindeki kod için geçerlidir. Daha fazla bilgi için bkz. about_Try_Catch_Finally.