PowerShell'de Try-Catch ile Hatalar Nasıl Ele Alınır?


Hataları veya istisnaları ele almak için PowerShell'de try-catch blokları yazmak her zaman iyi bir fikirdir. PowerShell betiklerinizin beklenmedik durumları sorunsuz bir şekilde ele almasını ve çalışmaya devam etmesini veya yararlı hata mesajları sunmasını sağlar. PowerShell'de hata işleme için Try, Catch ve Nihayet bloklarını kullanabilirsiniz.

Bu PowerShell eğitiminde size PowerShell'de hata işlemeyi uygulamak için try-catch bloklarının nasıl kullanılacağını göstereceğim.

PowerShell'deki hatalar

Öncelikle PowerShell'deki hataların neler olduğunu anlayalım.

Sonlandırma Hataları, komut dosyasının devam etmesini engelleyen ciddi hatalardır. Bunlar kritik derecede başarısız olan komutlardan kaynaklanabilir. Bir sonlandırma hatası oluştuğunda, try-catch bloğu tarafından işlenmediği sürece betiğin yürütülmesi durdurulur.

Sonlanmayan hatalar, komut dosyasının çalışmaya devam etmesine olanak tanır. Bu hatalar genellikle eksik dosyalar veya hata döndüren ancak betiği durdurmayan işlemler gibi sorunlarla ilgilidir. Sonlanmayan hatalar, incelenmek üzere hata kayıtlarının bir koleksiyonunu tutan $Error değişkenine kaydedilir.

Aşağıda PowerShell'deki yaygın hatalar verilmiştir.

  • Sözdizimi Hataları: Bunlar, komut dosyası geçersiz kod veya komutlar içerdiğinde ortaya çıkar. Komut dosyasının başarılı bir şekilde çalışabilmesi için sözdizimi hatalarının düzeltilmesi gerekir.
  • Çalışma Zamanı Hataları: Bunlar, komut dosyası yürütme sırasında belirli işlemler başarısız olduğunda meydana gelir. Yaygın çalışma zamanı hataları arasında dosya bulunamadı, izin reddedildi veya geçersiz veri biçimi hataları yer alır.

PowerShell'de bir hata oluştuğunda ErrorRecord nesnesi oluşturulur. Bu nesne, hatayla ilgili İstisna mesajı ve hatanın Kategorisi dahil olmak üzere ayrıntılı bilgiler içerir. Bu bilgi, sorunları ayıklamak ve düzeltmek için çok önemlidir.

PowerShell try-catch bloğunun kullanılması bu hataların etkili bir şekilde ele alınmasına yardımcı olur.

Şimdi PowerShell'de try-catch bloklarını nasıl uygulayacağımızı görelim.

PowerShell'de Try, Catch ve Nihayet nedir?

  • Dene: Bu blok, hatalara karşı izlemek istediğiniz kodu içerir.
  • Yakalama: Bu blok, Try bloğunda bir hata oluşması durumunda yürütülmesini istediğiniz kodu içerir.
  • Son olarak: Bu blok, hata oluşup oluşmadığına bakılmaksızın çalıştırmak istediğiniz kodu içerir.

PowerShell Try-Catch Nihayet bloğunun sözdizimi

PowerShell'deki Try-Catch bloğu iki ana bölümden oluşur: Try bloğu ve Catch bloğu. Try bloğu hataya neden olabilecek kodu içerir. Bir hata oluşursa kontrol Catch bloğuna geçer. PowerShell try-catch bloğunun sözdizimi şöyledir:

try {
    # Code that may throw an exception
}
catch {
    # Code to handle the error
}

Aşağıda PowerShell try catch ve nihayet bloke etme sözdizimi verilmiştir.

try {
    # Code that may throw an exception
}
catch {
    # Code to handle the error
}
finally {
    # Code that runs regardless of an error occurring or not
}

İşte try catch ve son olarak PowerShell'de nasıl kullanılacağına dair küçük bir örnek.

Bir sayıyı sıfıra bölmeye çalıştığımız basit bir örnekle başlayalım, bu bir istisna oluşturacaktır.

try {
    $result = 10 / 0
    Write-Output "Result: $result"
}
catch {
    Write-Output "An error occurred: $_"
}
finally {
    Write-Output "Execution completed."
}

Bu örnekte, catch bloğu sıfıra bölme hatasını yakalayacak ve bir hata mesajı yazdıracaktır. finally bloğu, bir hatanın oluşup oluşmadığına bakılmaksızın çalışacaktır.

Yukarıdaki PowerShell betiğini çalıştırdım ve çıktıyı aşağıdaki ekran görüntüsünde görebilirsiniz:

PowerShell'de Çoklu Yakalama Blokları

Şimdi size PowerShell'de birden fazla catch bloğunun nasıl ele alınacağını ve blokları yakalamaya çalışmak için PowerShell'de belirli istisnaların nasıl ele alınacağını göstereceğim.

Farklı türde istisnaları ele almak için birden fazla catch bloğunuz olabilir. Bu, daha spesifik hata işleme sağlamanıza olanak tanır.

try {
    $result = [int]::Parse("abc")
}
catch [System.FormatException] {
    Write-Output "Format exception: $_"
}
catch {
    Write-Output "An unexpected error occurred: $_"
}
finally {
    Write-Output "Execution completed."
}

Bu örnekte, "abc" dizesi bir tam sayıya dönüştürülemezse, ilk catch bloğu tarafından bir System.FormatException yakalanacaktır. Diğer istisnalar ikinci catch bloğu tarafından yakalanacaktır.

Çıktıyı aşağıdaki ekran görüntüsünde görebilirsiniz:

PowerShell nihayet yakalamayı deneyin örneği

PowerShell try catch nihayet bloğunun nasıl kullanılacağını görelim.

finally bloğu, bir hatanın oluşup oluşmadığına bakılmaksızın dosyaları veya veritabanı bağlantılarını kapatmak gibi kaynakları temizlemek için kullanışlıdır.

İşte bir örnek.

try {
    $file = [System.IO.StreamWriter]::new("example.txt")
    $file.WriteLine("Hello, World!")
    $file.Close()
}
catch {
    Write-Output "An error occurred: $_"
}
finally {
    if ($file -ne $null) {
        $file.Dispose()
        Write-Output "File closed."
    }
    Write-Output "Execution completed."
}

Bu örnekte, finally bloğu, yazma sırasında bir hata oluşsa bile dosyanın kapatılmasını sağlar.

PowerShell'de Yuvalanmış Deneme Yakalama

PowerShell'de iç içe try catch'in nasıl kullanılacağını görelim.

Komut dosyanızın farklı düzeylerinde hataları işlemek için try bloklarını birbirinin içine yerleştirebilirsiniz. İşte tam bir komut dosyası.

try {
    try {
        $result = 10 / 0
    }
    catch {
        Write-Output "Inner catch: Division by zero error."
    }

    $result = [int]::Parse("abc")
}
catch [System.FormatException] {
    Write-Output "Outer catch: Format exception."
}
finally {
    Write-Output "Execution completed."
}

Burada, içteki catch bloğu sıfır hatasına bölmeyi, dıştaki catch bloğu ise biçim istisnasını işler.

PowerShell yakalamayı dene devam et

Burada PowerShell try catch Continue'nun nasıl kullanılacağını göstereceğim.

n PowerShell'de, hataları işlemek için Try, Catch ve Nihayet bloklarını kullanabilirsiniz ve ayrıca komut dosyanızın daha sonra yürütülmeye devam etmesini sağlayabilirsiniz. bir hata oluşur. Bu, özellikle bir döngünüz veya bir dizi komutunuz varsa ve her yineleme veya komut için hataları yakalamak ancak betiğin tamamını durdurmak istemiyorsanız kullanışlıdır.

Burada hataların nasıl ele alınacağına ve yürütmeye nasıl devam edileceğine ilişkin bir örnek verilmiştir.

Sunucu adlarının bir listesine sahip olduğunuz ve her sunucunun durumunu kontrol etmek istediğiniz bir senaryoyu düşünelim. Bir sunucuyu kontrol ederken bir hata oluşursa, hatayı günlüğe kaydetmek ve kalan sunucuları kontrol etmeye devam etmek istersiniz.

İşte tam komut dosyası.

# List of server names
$servers = @("Server1", "Server2", "NonExistentServer", "Server3")

foreach ($server in $servers) {
    try {
        # Simulate checking server status
        if ($server -eq "NonExistentServer") {
            throw "Server not found"
        }
        Write-Output "Successfully checked $server"
    }
    catch {
        Write-Output "Error checking $server: $_"
    }
    finally {
        Write-Output "Finished checking $server"
    }
}

Write-Output "Script completed"

Yukarıdaki PowerShell betiğinin nasıl çalıştığı aşağıda açıklanmıştır.

  • Sunucu Listesi: Mevcut olmayan bir tane de dahil olmak üzere sunucu adlarından oluşan bir listemiz var ("NonExistentServer").
  • Sunucularda Döngü: Listedeki her sunucuda yineleme yapmak için bir foreach döngüsü kullanırız.
  • Deneme Bloğu: try bloğunun içinde, sunucu durumunun kontrol edilmesini simüle ederiz. Sunucu adı "NonExistentServer" ise, sunucu bulunamadı senaryosunu simüle etmek için bir hata atarız.
  • Yakalama Bloğu: catch bloğu hatayı yakalar ve günlüğe kaydeder. $_ otomatik değişken hata mesajını içerir.
  • Nihayet Engelle: finally bloğu, bir hatanın oluşup oluşmadığına bakılmaksızın try veya catch bloğundan sonra çalışır. Sunucu kontrolünün tamamlandığını günlüğe kaydeder.
  • Yürütmeye Devam Et: Bir hata oluşsa bile döngü bir sonraki sunucuya devam ederek tüm sunucuların kontrol edilmesini sağlar.

Komut dosyasını çalıştırdığınızda çıktı şu şekilde görünecektir:

Successfully checked Server1
Finished checking Server1
Successfully checked Server2
Finished checking Server2
Error checking NonExistentServer: Server not found
Finished checking NonExistentServer
Successfully checked Server3
Finished checking Server3
Script completed

Bu yaklaşım, her sunucunun kontrol edilmesini, hataların günlüğe kaydedilmesini ve betiğin bir hata nedeniyle durmadan çalışmaya devam etmesini sağlar.

PowerShell belirli bir hatayı yakalamayı deneyin

Şimdi belirli bir hatayı yakalamak için PowerShell'in nasıl kullanılacağına dair bir örnek görelim.

İstisna türünü catch anahtar kelimesinden sonra köşeli parantez içinde sağlayarak, yakalamak istediğiniz istisnanın türünü belirtebilirsiniz. Bu, farklı istisnaları farklı şekillerde ele almanıza olanak tanır.

Farklı türde istisnalar oluşturabilecek birden fazla işlem gerçekleştirdiğiniz ve her istisna tipini farklı şekilde ele almak istediğiniz bir senaryoyu ele alalım.

try {
    # Attempt to convert a string to a number (will throw a FormatException)
    $number = [int]::Parse("abc")
}
catch [System.FormatException] {
    Write-Output "Caught a format exception: $_"
}
catch [System.Exception] {
    Write-Output "Caught a general exception: $_"
}
finally {
    Write-Output "Execution completed."
}

PowerShell'de birden çok özel istisnayı ayrı ayrı ele aldığımız başka bir örnek:

try {
    # Simulate a file operation that might throw different exceptions
    $fileContent = Get-Content -Path "nonexistentfile.txt"
}
catch [System.IO.FileNotFoundException] {
    Write-Output "Caught a file not found exception: $_"
}
catch [System.UnauthorizedAccessException] {
    Write-Output "Caught an unauthorized access exception: $_"
}
catch {
    Write-Output "Caught an unexpected exception: $_"
}
finally {
    Write-Output "Execution completed."
}

PowerShell'de İstisna Atma

Burada size PowerShell'de istisnaların nasıl atılacağını göstereceğim.

PowerShell'de throw anahtar kelimesi, bir yakalama bloğu tarafından yakalanabilecek bir sonlandırma hatası oluşturmak için kullanılır.

İşte sözdizimi.

throw "Error message"

Ayrıca throw anahtar kelimesini ve ardından bir istisna nesnesini kullanarak da belirli istisnalar oluşturabilirsiniz.

throw [System.Exception]::new("Error message")

Basit bir örnekle başlayalım: Bir koşulun karşılanmaması durumunda PowerShell'de genel bir istisna atarız.

function Check-Number {
    param (
        [int]$number
    )

    if ($number -lt 0) {
        throw "The number cannot be negative."
    }

    Write-Output "The number is $number"
}

try {
    Check-Number -number -5
}
catch {
    Write-Output "Caught an exception: $_"
}
finally {
    Write-Output "Execution completed."
}

İşte başka bir örnek.

Daha ayrıntılı hata bilgileri sağlamak için belirli istisnalar oluşturabilirsiniz. Aşağıda, System.ArgumentException'ın kullanıldığı bir örnek verilmiştir.

function Validate-Input {
    param (
        [string]$input
    )

    if ([string]::IsNullOrEmpty($input)) {
        throw [System.ArgumentException]::new("Input cannot be null or empty.")
    }

    Write-Output "Valid input: $input"
}

try {
    Validate-Input -input ""
}
catch [System.ArgumentException] {
    Write-Output "Caught an argument exception: $_"
}
catch {
    Write-Output "Caught an unexpected exception: $_"
}
finally {
    Write-Output "Execution completed."
}

Yukarıdaki betiği çalıştırdığınızda çıktı şu şekilde olacaktır:

Caught an argument exception: Input cannot be null or empty.
Execution completed.

Bu çıktı, System.ArgumentException'ın belirli catch bloğu tarafından yakalandığını ve finally bloğunun daha sonra yürütüldüğünü gösterir.

PowerShell örnekleri yakalamayı deneyin

Şimdi birkaç PowerShell try-catch örneğini görelim.

Örnek 1: Dosya Bulunamadı İstisnasını İşleme

Aşağıdaki PowerShell betiği, var olmayan bir dosyayı okumaya çalışır, System.IO.FileNotFoundException dosyasını yakalar ve diğer beklenmeyen istisnaları işler.

try {
    # Attempt to read a file that does not exist
    $fileContent = Get-Content -Path "nonexistentfile.txt"
}
catch [System.IO.FileNotFoundException] {
    Write-Output "Caught a file not found exception: $_"
}
catch {
    Write-Output "Caught an unexpected exception: $_"
}
finally {
    Write-Output "Execution completed."
}

Örnek 2: Format İstisnasını İşleme

Aşağıdaki komut dosyası, geçersiz bir dizeyi bir tam sayıya dönüştürmeye çalışır, bir System.FormatException yakalar ve diğer beklenmeyen istisnaları ele alır.

try {
    # Attempt to convert an invalid string to an integer
    $number = [int]::Parse("abc")
}
catch [System.FormatException] {
    Write-Output "Caught a format exception: $_"
}
catch {
    Write-Output "Caught an unexpected exception: $_"
}
finally {
    Write-Output "Execution completed."
}

Örnek 3: Bir Fonksiyondaki Özel İstisna

Bu PowerShell betiği, sağlanan sayının negatif olması durumunda istisna oluşturan bir Kontrol Numarası işlevini tanımlar. Çağıran kod istisnayı yakalar ve onu işler.

function Check-Number {
    param (
        [int]$number
    )

    if ($number -lt 0) {
        throw "The number cannot be negative."
    }

    Write-Output "The number is $number"
}

try {
    # Call the function with an invalid number
    Check-Number -number -5
}
catch {
    Write-Output "Caught an exception: $_"
}
finally {
    Write-Output "Execution completed."
}

VS kodunu kullanarak çalıştırdıktan sonraki çıktıyı aşağıdaki ekran görüntüsünde görebilirsiniz.

Umarım artık PowerShell'de try catch'i nasıl kullanacağınızı biliyorsunuzdur. Ayrıca PowerShell try-catch bloklarının örneklerini de açıkladım.

İlgili makaleler