Aracılığıyla paylaş


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.

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:

  • trap deyimi bloğunu işledikten ve trapiçeren betiğin veya işlevin yürütülmesine devam ettikten sonra hatayı görüntüleyin. Bu davranış varsayılandır.

    Not

    Sonlandırma hatası bir deyim veya foreach döngü gibi if bir alt deyim bloğunda oluştuğunda, bloktaki trap deyimler çalıştırılır ve alt bloğun dışındaki bir sonraki deyimde yürütme devam eder.

  • trap içeren betiğin veya işlevin yürütülmesini, break deyimindeki trap kullanarak hatayı görüntüleyip yürütmeyi durdurarak sonlandırın.

  • Hatayı susturun, ancak trap deyimindeki continue kullanarak trap iç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şlenmemiş bir sonlandırma hatası oluştuğunda, PowerShell hatayı işleyen bir trap deyimini denetler. bir trap deyimi varsa PowerShell, trap deyiminde betiği veya komutu çalıştırmaya devam eder.

Aşağıdaki örnek minimal bir trap açıklamasıdır:

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ğı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 $PSItem otomatik değişkenini $_ 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 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, bir bloktaki trap deyimleri, diğer tüm deyimler yürütülmeden önce belirlenir. JavaScript gibi diğer dillerde bu, kaldırma olarak bilinir. Bu, yürütme tanımlandığı noktayı aşmamış olsa bile trap deyimlerinin bu bloktaki tüm deyimlere uygulanacağı 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'
}

İşlev veya betik bilinen bir komutla eşleşmeyen bir dizeyle karşılaştığında, bu trap deyimi Command error trapped 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 komutlardan kaynaklanan 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 fazla trap deyimi olabilir. Her hata türünü yalnızca bir trap deyimi 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, 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 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 nonsenseString cmdlet veya başka bir öğe olarak tanımadığından, CommandNotFoundException hatası döndürür. Belirli trap deyimi bu sonlandırıcı hatayı yakalar.

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 |
   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ı yakalayan diğer trap deyimi, sıfıra bölünme hatasını da yakalar.

Betik bloğunda yakalama hataları

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 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. PowerShell 1'i 0'a bölmeye çalıştığında bir sonlandırma hatası verir. Betik deyiminin geri kalanını foreach atlar, deyimini try ç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 sonraki ifadede 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 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 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

Fonksiyondaki trap deyimi hatayı tutar. İletiyi görüntüledikten sonra PowerShell işlevi çalıştırmaya devam eder. Function1 ifadesinden sonra trap'ın tamamlandığına dikkat edin.

Bu davranışı, aynı hataya ve trap deyimine sahip 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 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 komutu çalıştırılamıyordu. Her iki örnekte de sonlandırma hatası işlevinde oluşur. Ancak bu örnekte trap deyimi işlevin dışındadır. trap deyimi çalıştırıldıktan sonra PowerShell işlevine 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 trap ile whoops 1 çalıştırılır.

Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }

Önemli

trap deyiminin kapsamı derlendiği yerle sınırlıdır. İş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 deyimi break anahtar sözcüğünü içerdiğinden işlev çalışmaya devam etmez ve Function completed satırı çalıştırılamaz.

continue deyimine trap anahtar sözcüğü eklerseniz PowerShell, hataya neden olan deyiminden sonra break veya continueolmadan olduğu gibi devam eder. Ancak continue anahtar sözcüğüyle PowerShell hata akışına hata yazmaz.

Aşağıdaki örnek işlev, continue deyiminde trap anahtar sözcüğünü 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 End of function deyimi çalıştırıldıktan sonra işlev sürdürülür. Hata akışına hiçbir hata yazılmadı.

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 catch tanımlandığı blokları kullanıntry/catch. 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.

Ayrıca bakınız