about_Try_Catch_Finally
Kısa açıklama
Sonlandırıcı hataları işlemek için , catch
ve finally
bloklarının nasıl kullanılacağını try
açıklar.
Uzun açıklama
Betiklerdeki sonlandırıcı hataları yanıtlamak veya işlemek için , catch
ve 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
, catch
ve finally
C# programlama dilinde kullanılan , catch
ve 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 try
catch
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.doc
bir 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 try
daha 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 $PSItem
da 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.
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