about_Trap
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 sonlandırıcı bir hatayı bir şekilde işlemezse PowerShell işlevi veya betiği geçerli işlem hattında çalıştırmayı da durdurur. C# gibi diğer dillerde sonlandırma hataları özel durumlar olarak bilinir.
anahtar trap
sözcüğü, sonlandırıcı bir hata oluştuğunda çalıştırılacak deyimlerin listesini belirtir. trap
deyimleri, sonlandırıcı hataları aşağıdaki yollarla işleyebilir:
deyimi bloğunu
trap
işledikten ve betiği veya işlevi içerentrap
yürütmeye devam ettikten sonra hatayı görüntüleyin. Bu davranış varsayılandır.Not
Sonlandırma hatası bir deyim veya
foreach
döngü gibiif
bir alt betik bloğunda oluştuğunda, bloktakitrap
deyimler çalıştırılır ve alt betik bloğunun dışındaki sonraki deyimde yürütme devam eder.deyiminde using
break
öğesini içeren betiğin veya işlevin yürütülmesini ve yürütülmesini durdurma hatasınıtrap
trap
görüntüleyin.Hatayı susturun, ancak deyiminde kullanarak
continue
öğesini içerentrap
betiğin veya işlevin yürütülmesinetrap
devam edin.
deyiminin 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
deyimi trap
aşağıdaki söz dizimine sahiptir:
trap [[<error type>]] {<statement list>}
deyimi, trap
sonlandırıcı bir hata oluştuğunda çalıştırılacak deyimlerin listesini içerir. Deyimi trap
, isteğe bağlı olarak bir tür ifadesi ve bir hata kapana kısıldığında çalıştırılacak deyim listesini içeren deyim bloğu olan anahtar sözcüğünden oluşur trap
. Tür ifadesi, yakaladığı hata trap
türlerini iyileştirmektedir.
Bir betik veya komutun birden çok trap
deyimi olabilir. trap
deyimleri betikte veya komutta herhangi bir yerde görünebilir.
Tüm sonlandırıcı hataları yakalama
Bir betik veya komutta başka bir şekilde işlenmemiş bir sonlandırma hatası oluştuğunda, PowerShell hatayı işleyen bir trap
deyimi denetler. Bir trap
deyim varsa, PowerShell deyiminde betiği veya komutu çalıştırmaya trap
devam eder.
Aşağıdaki örnek minimal trap
bir deyimdir:
trap { 'Error found.' }
Bu trap
deyim, 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ğıdaki çıkışı döndürür:
Error found.
nonsenseString:
Line |
3 | nonsenseString
| ~~~~~~~~~~~~~~
| The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable 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, otomatik değişkeni kullanarak $_
hatayı görüntüleyen bir trap
deyim içerir:
function TrapTest {
trap { "Error found: $_" }
nonsenseString
}
TrapTest
İşlevin bu sürümünü çalıştırmak aşağıdaki çıkışı 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 a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
Önemli
trap
deyimleri belirli bir betik bloğu içinde herhangi bir yerde tanımlanabilir, ancak her zaman bu betik bloğundaki tüm deyimler için geçerlidir. Çalışma zamanında, trap
bir bloktaki deyimler diğer deyimler yürütülmeden önce tanımlanır.
JavaScript'te bu, kaldırma olarak bilinir. Bu, trap
yürütme tanımlandığı noktayı aşmamış olsa bile deyimlerin bu bloktaki tüm deyimler için geçerli olduğu anlamına gelir. Örneğin, betiğin sonunda bir trap
tanımlama ve ilk deyimde hata oluşturma işlemi yine de tetikler trap
.
Belirli hataları yakalama
Bir betik veya komutun birden çok trap
deyimi olabilir. trap
belirli hataları işlemek için tanımlanabilir.
Aşağıdaki örnek, CommandNotFoundException hatasını yakalamaya yönelik bir trap
deyimdir:
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
Bir işlev veya betik bilinen bir komutla eşleşmeyen bir dizeyle karşılaştığında, bu trap
deyim dizeyi Command error trapped
görüntüler.
Deyimini çalıştırdıktan trap
sonra PowerShell hata nesnesini hata akışına yazar ve betiği 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 komutlar tarafından tetiklenen hataları yakalar. Ayrıca diğer hata türlerini de yakalar.
Hata nesnesini inceleyerek hatanın özel durum türünü bulabilirsiniz. Aşağıdaki örnekte, bir oturumdaki son hata için özel durumun tam adını alma gösterilmektedir:
nonsenseString
$Error[0].Exception.GetType().FullName
nonsenseString: The term 'nonsenseString' is not recognized as a name of a
cmdlet, function, script file, or executable program. Check the spelling
of the name, or if a path was included, verify that the path is correct
and try again.
System.Management.Automation.CommandNotFoundException
Betikte birden trap
fazla deyiminiz olabilir. Her hata türünü yalnızca bir trap
deyim yakalayabilir. Sonlandırma hatası oluştuğunda PowerShell, geçerli betik yürütme bloğundan başlayarak en belirli eşleşmeyle öğesini arar trap
.
Aşağıdaki betik örneği bir hata içeriyor. Betik, herhangi bir sonlandırıcı hatayı yakalamaya yönelik genel trap
bir deyimi ve CommandNotFoundException türünü belirten belirli trap
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 a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
PowerShell bir cmdlet veya başka bir öğe olarak tanımadığından nonsenseString
CommandNotFoundException hatası döndürür. Belirli trap
bir deyim bu sonlandırıcı hatayı yakalar.
Aşağıdaki betik örneği, farklı bir hatayla aynı trap
deyimleri 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 |
5 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
Sıfıra bölme girişimi CommandNotFoundException hatası oluşturmaz. Herhangi bir sonlandırıcı hatayı yakalar diğer trap
deyimi, bölmeyi sıfıra böl hatasını yakalar.
Betik bloğunda yakalama hataları
Varsayılan olarak, sonlandırıcı bir hata oluşturulduğunda yürütme, yakalama deyimine aktarılır. Blok çalıştırıldıktan trap
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 bloğun içinde değil, bloğun foreach
sonraki deyiminde foreach
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:
Line |
3 | 1/$x
| ~~~~
| Attempted to divide by zero.
after loop
Çıktıda, döngülerin son yinelemeye kadar devam ettiğinizi görebilirsiniz. Betik 1'i 0'a bölmeye çalıştığında PowerShell sonlandırıcı bir hata oluşturur. Betik, betik bloğunun foreach
geri kalanını atlar, deyimini try
çalıştırır ve betik bloğundan foreach
sonra devam eder.
Yakalama hataları ve kapsamı
Deyimiyle aynı betik bloğunda trap
bir sonlandırma hatası oluşursa, PowerShell tarafından trap
tanımlanan deyimlerin listesini çalıştırır. Yürütme, hatadan sonra deyiminde devam eder. trap
Deyimi hatadan farklı bir betik bloğundaysa, yürütme deyimiyle aynı betik bloğunda yer alan sonraki deyimde trap
devam eder.
Ö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 bir trap
deyim 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 a name of a cmdlet,
function, script file, or executable 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
trap
İşlevdeki deyimi hatayı yakalar. İletiyi görüntüledikten sonra PowerShell işlevi çalıştırmaya devam eder. deyiminden sonra tamamlandığına Function1
trap
dikkat edin.
Bu davranışı, aynı hata ve trap
deyime sahip olan aşağıdaki örnekle karşılaştırın. Bu örnekte deyimi trap
işlevin dışında gerçekleşir:
function function2 {
NonsenseString
'function2 was completed'
}
trap { 'An error:' }
function2
işlevini çalıştırmak Function2
aşağıdaki sonucu verir:
An error:
NonsenseString:
Line |
2 | NonsenseString
| ~~~~~~~~~~~~~~
| The term 'NonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable 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
komut çalıştırılamıyordu. Her iki örnekte de sonlandırma hatası işlevinde oluşur. Ancak trap
bu örnekte deyimi işlevin dışındadır. Deyimi çalıştırıldıktan sonra PowerShell işlevine trap
geri dönmez.
Dikkat
Aynı hata koşulu için birden çok yakalama tanımlandığında, ilk trap
sözcüksel olarak tanımlanan (betik bloğundaki en yüksek) kullanılır.
Aşağıdaki örnekte, yalnızca ile whoops 1
çalıştırmalarıtrap
.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }
Önemli
Bir trap
deyiminin kapsamı, derlendiği yer olarak belirlenmiştir. İşlevin veya nokta kaynaklı betiğin içinde bir trap
deyiminiz varsa, işlev veya nokta kaynaklı betikten çıkıldığında içindeki tüm trap
deyimler kaldırılır.
Break ve continue anahtar sözcüklerini kullanma
Bir betiğin veya komutun break
sonlandırıcı bir trap
hatadan sonra çalışmaya devam edip etmediğini belirlemek için deyimindeki ve continue
anahtar sözcüklerini kullanabilirsiniz.
Deyim listesine bir break
trap
deyim eklerseniz, PowerShell işlevi veya betiği durdurur. Aşağıdaki örnek işlev, deyiminde trap
anahtar sözcüğünü break
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.
deyimi anahtar sözcüğünü trap
içerdiğinden break
işlev çalışmaya devam etmez ve Function completed
satır çalıştırılamaz.
Bir deyime trap
anahtar continue
sözcük eklerseniz PowerShell, hataya neden olan deyiminden sonra veya continue
olmadan break
olduğu gibi devam eder. Ancak anahtar sözcüğüyle continue
PowerShell, hata akışına hata yazmaz.
Aşağıdaki örnek işlev, deyiminde trap
anahtar sözcüğünü continue
kullanır:
function continue_example {
trap {
'Error trapped'
continue
}
1/$null
'Function completed.'
}
continue_example
Error trapped
Function completed.
Hata kapana kısıldıktan ve deyimi çalıştırıldıktan Function completed
sonra işlev devam eder. Hata akışına hiçbir hata yazıldı.
Notlar
trap
deyimleri, bir betik bloğundaki tüm sonlandırıcı hataların işlenmesini sağlamak için bir yol sağlar. Daha ayrıntılı hata işleme için, tuzakların deyimleri kullanılarak tanımlandığı blokları kullanıntry
catch
/.catch
catch
Deyimler yalnızca ilişkili try
deyiminin içindeki kod için geçerlidir. Daha fazla bilgi için bkz . about_Try_Catch_Finally.
Ayrıca bkz.
PowerShell
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin