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
Deyim sonlandırıcı ve betik sonlandırma hatalarını işleyen bir anahtar sözcüğü açıklar.
Uzun açıklama
Sonlandırma hatası bir deyimin çalışmasını durdurur. PowerShell , deyim sonlandırma hatalarını (yalnızca geçerli deyimi durduran) betik sonlandırma hatalarından (çağrı yığınının tamamını çözen) ayırır. anahtar trap sözcüğü her iki türü de işleyebilir. Hata kategorileri hakkında daha fazla bilgi için bkz. about_Error_Handling.
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
trapişledikten ve betiği veya işlevi içerentrapyürütmeye devam ettikten sonra hatayı görüntüleyin. Bu davranış varsayılandır.Not
Sonlandırma hatası bir deyim veya
ifdöngü gibiforeachbir alt deyim bloğunda oluştuğunda, bloktakitrapdeyimler çalıştırılır ve alt bloğun dışındaki bir sonraki deyimde yürütme devam eder.deyiminde using
trapöğesini içeren betiğin veya işlevin yürütülmesini ve yürütülmesini durdurma hatasınıbreaktrapgörüntüleyin.Hatayı susturun, ancak deyiminde kullanarak
trapöğesini içerencontinuebetiğin veya işlevin yürütülmesinetrapdevam 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, veya trap otomatik değişkenini $_ kullanarak hatayı görüntüleyen bir $PSItem 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 scriptblock 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 gibi diğer dillerde 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ırıcı bir hata oluştuğunda PowerShell, yürütmenin geçerli betik 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 CommandNotFoundExceptiontrapbelirli 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..-1) {
"1/$x = "
"`t$(1/$x)"
}
'after loop'
1/3 =
0.333333333333333
1/2 =
0.5
1/1 =
1
1/0 =
An error occurred!
RuntimeException:
Line |
4 | "`t$(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 deyiminin geri kalanını foreach atlar, deyimini trap çalıştırır ve deyiminden foreach sonra devam eder.
Yakalama hataları ve kapsamı
Deyimiyle aynı betik bloğunda trap bir sonlandırma hatası oluşursa, PowerShell tarafından traptanı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ı scriptblock'ta trap yer alan sonraki deyimde 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 Function1trap 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, sözcük temelli olarak tanımlanan ilk trap tuzak (betik bloğunda en yüksek) kullanılır.
Aşağıdaki örnekte, yalnızca ile trap çalıştırmalarıwhoops 1.
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 continue hatadan sonra çalışmaya devam edip etmediğini belirlemek için deyimindeki ve trap anahtar sözcüklerini kullanabilirsiniz.
Deyim listesine bir breaktrap deyim eklerseniz, PowerShell işlevi veya betiği durdurur. Aşağıdaki örnek işlev, deyiminde break anahtar sözcüğünü trap 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 continue anahtar trap sözcük eklerseniz PowerShell, hataya neden olan deyiminden sonra veya breakolmadan continue olduğu gibi devam eder. Ancak anahtar sözcüğüyle continue PowerShell, hata akışına hata yazmaz.
Aşağıdaki örnek işlev, deyiminde continue anahtar sözcüğünü trap kullanır:
function ContinueExample {
trap {
'Error trapped'
continue
}
foreach ($x in 3..-1) {
"1/$x = "
"`t$(1/$x)"
}
'End of function'
}
ContinueExample
1/3 =
0.333333333333333
1/2 =
0.5
1/1 =
1
1/0 =
Error trapped
End of function
Hata kapana kısıldıktan ve deyimi çalıştırıldıktan End of function sonra işlev devam eder. Hata akışına hiçbir hata yazıldı.
Notes
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 deyimler kullanılarak try/catch tanımlandığı blokları kullanıncatch.
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 bakınız
PowerShell