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ırma ve betik sonlandırma hatalarını 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 try, catchve finally blokları kullanın. PowerShell'de iki tür sonlandırma hatası vardır:
- geçerli deyimini durduran deyim sonlandırma hataları ve
- çağrı yığınının tamamını çözen betik sonlandırma hataları
her iki tür tarafından try/catchyakalanmış. Sonlandırıcı hataları işlemek için deyimini trap de kullanabilirsiniz. Daha fazla bilgi için bkz. about_Trap. Tüm hata türlerine kapsamlı bir genel bakış için bkz. about_Error_Handling.
Deyim sonlandırma hatası geçerli deyimin çalışmasını durdurur, ancak hata betik sonlandırıcı olmadığı sürece PowerShell bir sonraki deyimde devam eder. Betik sonlandırma hatası (anahtar sözcüğü tarafından throw oluşturulan bir hata gibi) bir try/catch blok veya trap deyim tarafından yakalanmadığı sürece betiğin tamamını durdurur.
Not
$ErrorActionPreference , öğesini gizleyebilir throw. veya Ignoreolarak ayarlandığında SilentlyContinue hata yayılmaz ve yürütme sonraki deyimde devam eder. Ayrıntılar için about_Error_Handling Betik sonlandırma hataları bölümüne bakın.
PowerShell'in hataları izlemesini istediğiniz bir betiğin bölümünü tanımlamak için try bloğunu kullanın.
try bloğunda bir hata oluştuğunda, hata ilk olarak $Error otomatik değişkenine kaydedilir. PowerShell daha sonra hatayı işlemek için bir catch bloğu arar.
try deyiminin eşleşen bir catch bloğu yoksa, PowerShell üst kapsamlarda uygun bir catch bloğu veya trap deyimini aramaya devam eder. bir catch bloğu tamamlandıktan sonra veya uygun catch bloğu veya trap deyimi bulunamazsa, finally bloğu çalıştırılır. Hata işlenemiyorsa hata, hata akışına yazılır.
catch bloğu, hatayı izlemeye veya betiğin beklenen akışını kurtarmaya yönelik komutları içerebilir.
catch bloğu hangi hata türlerinin yakalanacağını belirtebilir.
try deyimi, farklı hata türleri için birden çok catch bloğu içerebilir.
finally bloğu, betiğinizin artık ihtiyaç duyulmadığı tüm kaynakları boşaltmak için kullanılabilir.
try, catchve finally C# programlama dilinde kullanılan try, catchve finally anahtar sözcüklerine benzer.
Sözdizimi
try deyimi bir try bloğu, sıfır veya daha fazla catch bloğu ve sıfır veya bir finally bloğu içerir.
try deyiminin en az bir catch bloğu veya bir finally bloğu olmalıdır.
Aşağıda try bloğu söz dizimi gösterilmektedir:
try {<statement list>}
try anahtar sözcüğünden sonra 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 try bloğundan uygun bir catch bloğuna geçirir.
Aşağıda catch bloğu söz dizimi gösterilmektedir:
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.
catch anahtar sözcüğünü, isteğe bağlı hata türü belirtimleri listesi ve deyim listesi izler.
try bloğunda sonlandırma hatası oluşursa PowerShell uygun bir catch bloğu arar. Bir tane bulunursa, catch bloğundaki deyimler yürütülür.
catch bloğu bir 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.
catch bloğu, 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.
catch bloğu bir hata türü belirtirse, bu catch blok bu tür bir hatayı işler. bir catch bloğu bir hata türü belirtmezse, bu catch blok try bloğunda karşılaşılan tüm hataları işler.
try deyimi, belirtilen farklı hata türleri için birden çok catch bloğu içerebilir.
Aşağıda finally bloğu söz dizimi gösterilmektedir:
finally {<statement list>}
finally anahtar sözcüğü, try deyimi hatasız çalıştırılsa veya catch deyiminde bir hata yakalansa bile, betik her çalıştırıldığında çalışan bir deyim listesi izler.
CTRL+C 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, bloğu çalıştırılsa bile +finallytuşuna bastıktan sonra görüntülenmez.
Hataları yakalama
Aşağıdaki örnek betik, try bloğu olan bir catch bloğunu gösterir:
try { NonsenseString }
catch { "An error occurred." }
catch anahtar sözcüğü hemen try bloğunu veya başka bir catch bloğunu izlemelidir.
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.
catch bloğu, bloğun içinde deyim listesini çalıştırarak hatayı işler.
BIRDEN ÇOK CATCH DEYIMI KULLANMA
try deyiminde herhangi bir sayıda catch bloğu olabilir. Örneğin, aşağıdaki betik tryindiren bir MyDoc.doc bloğuna sahiptir ve iki catch bloğu içerir:
try {
$wc = New-Object System.Net.WebClient
$wc.DownloadFile("https://httpbin.org/MyDoc.doc","C:\temp\MyDoc.doc")
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
}
İlk catch bloğu, System.Net.WebException ve System.IO.IOException türlerinin hatalarını işler. İkinci catch bloğu bir hata türü belirtmez. İkinci catch bloğu, oluşan diğer sonlandırıcı hataları işler.
PowerShell, devralma yoluyla hata türleriyle eşleşir.
catch bloğu, 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 bloğu içerir:
catch [System.Management.Automation.CommandNotFoundException] {
"Inherited Exception"
}
CommandNotFoundException belirtilen hata türü, System.SystemException türünden devralır. Aşağıdaki örnek ayrıca Bir Komut Bulunamadı hatasını yakalar:
catch [System.SystemException] {"Base Exception" }
Bu catch bloğu, SystemException türünden devralan "Komut Bulunamadı" hatasını ve diğer hataları işler.
Bir hata sınıfı ve türetilmiş sınıflarından birini belirtirseniz, türetilmiş sınıf için catch bloğunu genel sınıfın catch bloğundan önce yerleştirin.
Not
PowerShell, RuntimeException türünde 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.
Bir deneme yakalamasında tuzakları kullanma
eşleşen bir try bloğu olsa bile, trap bloğunda tanımlanmış bir try içeren bir catch bloğunda sonlandırma hatası oluştuğunda, trap deyimi denetimi alır.
trapdaha yüksek bir blokta bir try varsa ve geçerli kapsam içinde eşleşen catch bloğu yoksa, üst kapsamın eşleşen bir trap bloğu olsa bile catch denetimi alır.
Özel durum bilgilerine erişme
Bir catch blok içinde, veya $_ otomatik değişkeni kullanılarak geçerli hataya $PSItem erişilebilir. nesnesi 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, Exceptionve ErrorDetailsgibi ek özelliklere erişilebilir. Ö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 finally ve try bloklarının arkasına bir catch bloğu ekleyin.
finally blok deyimleri, try bloğunun sonlandırıcı bir hatayla karşılaşıp karşılaşmadığına bakılmaksızın çalışır. PowerShell, betik sonlandırılmadan veya geçerli blok kapsam dışına çıkmadan önce finally bloğunu çalıştırır.
Betiği durdurmak için finally+ kullansanız bile bloğu çalışır.
finally anahtar sözcüğü betiği bir exit bloğunun içinden durdurursa catch bloğu da çalışır.
Aşağıdaki örnekte, try bloğu C:\temp klasörüne dosya indirmeyi dener.
catch blokları indirme sırasında oluşan hataları işler.
finally bloğu WebClient nesnesini atar ve varsa geçici dosyayı kaldırır.
try {
$wc = New-Object System.Net.WebClient
$tempFile = "C:\temp\MyDoc.doc"
$wc.DownloadFile("https://httpbin.org/MyDoc.doc",$tempFile)
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
} finally {
$wc.Dispose()
if (Test-Path $tempFile) { Remove-Item $tempFile }
}
Ayrıca bakınız
PowerShell