about_Try_Catch_Finally

Kısa açıklama

Sonlandırıcı hataları işlemek için , catchve finally bloklarının nasıl kullanılacağını tryaçıklar.

Uzun açıklama

Betiklerdeki sonlandırıcı hataları yanıtlamak veya işlemek için , catchve finally bloklarını kullanıntry. deyimi Trap , betiklerdeki sonlandırıcı hataları işlemek için de kullanılabilir. Daha fazla bilgi için bkz . about_Trap.

Sonlandırma hatası bir deyimin çalışmasını durdurur. PowerShell bir şekilde sonlandırıcı bir hatayı işlemezse PowerShell, geçerli işlem hattını kullanarak işlevi veya betiği çalıştırmayı da durdurur. C# gibi diğer dillerde sonlandırma hataları özel durumlar olarak adlandırılır.

PowerShell'in try hataları izlemesini istediğiniz bir betiğin bölümünü tanımlamak için bloğunu kullanın. Blok içinde bir hata oluştuğunda try , hata ilk olarak otomatik değişkene $Error kaydedilir. PowerShell daha sonra hatayı işlemek için bir catch blok arar. Deyiminin try eşleşen catch bir bloğu yoksa PowerShell üst kapsamlarda uygun catch bir bloğu veya Trap deyimi aramaya devam eder. Bir catch blok tamamlandıktan sonra veya uygun catch bir blok veya Trap deyim bulunamazsa, finally blok çalıştırılır. Hata işlenemiyorsa hata, hata akışına yazılır.

Blok catch , hatayı izlemeye veya betiğin beklenen akışını kurtarmaya yönelik komutları içerebilir. Blok catch , hangi hata türlerinin yakalanacağını belirtebilir. Deyimi try , farklı hata türleri için birden çok catch blok içerebilir.

finally Blok, betiğinizin artık ihtiyaç duyulmadığı tüm kaynakları boşaltmak için kullanılabilir.

try, catchve finally C# programlama dilinde kullanılan , catchve finally anahtar sözcüklerine benzertry.

Sözdizimi

Deyimi try bir try blok, sıfır veya daha fazla catch blok ve sıfır veya bir finally blok içerir. Deyimin try en az bir catch bloğu veya bir finally bloğu olmalıdır.

Aşağıda blok söz dizimi gösterilmektedir try :

try {<statement list>}

Anahtar sözcüğün try ardından küme ayraçlarındaki bir deyim listesi eklenir. Deyim listesindeki deyimler çalıştırılırken bir sonlandırma hatası oluşursa, betik hata nesnesini bloktan try uygun catch bir bloğa geçirir.

Aşağıda blok söz dizimi gösterilmektedir catch :

catch [[<error type>][',' <error type>]*] {<statement list>}

Hata türleri köşeli ayraç içinde görüntülenir. En dış köşeli ayraçlar öğenin isteğe bağlı olduğunu gösterir.

Anahtar sözcüğün catch ardından hata türü belirtimlerinin isteğe bağlı bir listesi ve bir deyim listesi eklenir. Blokta try sonlandırıcı bir hata oluşursa, PowerShell uygun catch bir bloğu arar. Biri bulunursa, bloktaki catch deyimler yürütülür.

Blok bir catch veya daha fazla hata türü belirtebilir. Hata türü, Bir Microsoft .NET Framework özel durumu veya .NET Framework özel durumu türetilen bir özel durumdur. Blok catch , belirtilen .NET Framework özel durum sınıfının veya belirtilen sınıftan türetilen herhangi bir sınıfın hatalarını işler.

Bir catch blok bir hata türü belirtirse, bu catch blok bu tür bir hatayı işler. Bir catch blok bir hata türü belirtmezse, bu catch blok blokta try karşılaşılan tüm hataları işler. Bir try deyim, belirtilen farklı hata türleri için birden çok catch blok içerebilir.

Aşağıda blok söz dizimi gösterilmektedir finally :

finally {<statement list>}

Anahtar sözcüğü, finally betik her çalıştırıldığında, deyimi hatasız çalıştırılsa veya bir deyimde bir hata yakalansa try bile çalışan bir catch deyim listesi izler.

CTRL+C tuşlarına basıldığında işlem hattının durdurulduğunu unutmayın. İşlem hattına gönderilen nesneler çıkış olarak görüntülenmez. Bu nedenle, görüntülenecek "Finally block has run" gibi bir deyim eklerseniz, blok çalıştırılsa finally bile CTRL+C tuşuna bastıktan sonra görüntülenmez.

Hataları yakalama

Aşağıdaki örnek betik, bloğu olan bir trycatch bloğu gösterir:

try { NonsenseString }
catch { "An error occurred." }

Anahtar sözcüğü hemen catch bloğu veya başka bir catch bloğu izlemelidirtry.

PowerShell, "NonsenseString" öğesini bir cmdlet veya başka bir öğe olarak tanımaz. Bu betiği çalıştırmak aşağıdaki sonucu döndürür:

An error occurred.

Betik "NonsenseString" ile karşılaştığında sonlandırıcı bir hataya neden olur. Blok, catch bloğun içinde deyim listesini çalıştırarak hatayı işler.

Birden çok catch deyimi kullanma

Deyiminin try herhangi bir catch sayıda bloğu olabilir. Örneğin, aşağıdaki betiğin dosyasını indiren MyDoc.docbir try bloğu vardır ve iki catch blok içerir:

try {
   $wc = new-object System.Net.WebClient
   $wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException] {
    "Unable to download MyDoc.doc from http://www.contoso.com."
}
catch {
    "An error occurred that could not be resolved."
}

İlk catch blok System.Net.WebException ve System.IO.IOException türlerinin hatalarını işler. İkinci catch blok bir hata türü belirtmez. İkinci catch blok, oluşan diğer sonlandırıcı hataları işler.

PowerShell, devralma yoluyla hata türleriyle eşleşir. Blok catch , belirtilen .NET Framework özel durum sınıfının veya belirtilen sınıftan türetilen herhangi bir sınıfın hatalarını işler. Aşağıdaki örnek, "Komut Bulunamadı" hatasını yakalayan bir catch blok içerir:

catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }

Belirtilen hata türü olan CommandNotFoundException, System.SystemException türünden devralınır. Aşağıdaki örnek ayrıca Bir Komut Bulunamadı hatasını yakalar:

catch [System.SystemException] {"Base Exception" }

Bu catch blok, "Komut Bulunamadı" hatasını ve SystemException türünden devralan diğer hataları işler.

Bir hata sınıfı ve türetilmiş sınıflarından birini belirtirseniz türetilmiş sınıfın catch bloğunu genel sınıfın bloğundan catch önce yerleştirin.

Not

PowerShell, runtimeexception türündeki tüm özel durumları sarmalar. Bu nedenle, System.Management.Automation.RuntimeException hata türünü belirtmek nitelenmemiş bir catch bloğuyla aynı şekilde davranır.

Deneme Yakalamasında Tuzakları Kullanma

Blok içinde tanımlanmış bir try blokta Trap bir sonlandırma hatası oluştuğunda, eşleşen catch bir blok olsa bile deyimi Trap denetimi try alır.

bir Trap öğesi, değerinden trydaha yüksek bir blokta varsa ve geçerli kapsam içinde eşleşen catch bir blok yoksa, üst kapsamın Trap eşleşen catch bir bloğu olsa bile denetimi alır.

Özel durum bilgilerine erişme

Bir catch blok içinde geçerli hataya olarak $PSItemda bilinen kullanılarak $_erişilebilir. Nesne ErrorRecord türündedir.

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_
}

Bu betiği çalıştırmak aşağıdaki sonucu döndürür:

An Error occurred:
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.

ScriptStackTrace, Exception ve ErrorDetails gibi erişilebilen ek özellikler vardır. Örneğin, betiği aşağıdaki şekilde değiştirirsek:

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_.ScriptStackTrace
}

Sonuç şuna benzer olacaktır:

An Error occurred:
at <ScriptBlock>, <No file>: line 2

Finally kullanarak kaynakları boşaltma

Betik tarafından kullanılan kaynakları boşaltmak için ve catch bloklarının try arkasına bir finally blok ekleyin. finally Blok deyimleri, bloğun try sonlandırıcı bir hatayla karşılaşıp karşılaşmadığına bakılmaksızın çalışır. PowerShell, betik sonlandırilmeden önce veya geçerli blok kapsam dışına çıkmadan önce bloğu çalıştırır finally .

finally Betiği durdurmak için CTRL+C kullansanız bile bir blok çalışır. finally Exit anahtar sözcüğü betiği bir bloğun içinden durdurursa bir catch blok da çalışır.

Ayrıca bkz.