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çeren trapyü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ü gibi if bir alt betik bloğunda oluştuğunda, bloktaki trap 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ı traptrap görüntüleyin.

  • Hatayı susturun, ancak deyiminde kullanarak continue öğesini içeren trap betiğin veya işlevin yürütülmesine trap 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 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ı 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 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, 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 breaktrap 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 continueolmadan 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ıntrycatch/.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.