about_Try_Catch_Finally

Deskripsi singkat

Menjelaskan cara menggunakan tryblok , catch, dan finally untuk menangani kesalahan penghentian pernyataan dan penghentian skrip.

Deskripsi panjang

Gunakan blok try, catch, dan finally untuk merespons atau menangani kesalahan penghentian dalam skrip. PowerShell memiliki dua jenis kesalahan penghentian:

  • kesalahan penghentian pernyataan yang menghentikan pernyataan saat ini dan
  • kesalahan penghentian skrip yang melepas seluruh tumpukan panggilan

Kedua jenis ditangkap oleh try/catch. Anda juga dapat menggunakan trap pernyataan untuk menangani kesalahan penghentian. Untuk informasi selengkapnya, lihat about_Trap. Untuk gambaran umum komprehensif tentang semua jenis kesalahan, lihat about_Error_Handling.

Kesalahan penghentian pernyataan menghentikan pernyataan saat ini agar tidak berjalan, tetapi PowerShell berlanjut pada pernyataan berikutnya kecuali kesalahan juga mengakhiri skrip. Kesalahan penghentian skrip (seperti kesalahan yang dihasilkan oleh throw kata kunci) menghentikan seluruh skrip kecuali tertangkap oleh try/catch blok atau trap pernyataan.

Nota

$ErrorActionPreference dapat menekan throw. Ketika diatur ke SilentlyContinue atau Ignore, kesalahan tidak disebarluaskan dan eksekusi berlanjut pada pernyataan berikutnya. Untuk detailnya, lihat bagian Kesalahan penghentian Skripdi about_Error_Handling.

Gunakan blok try untuk menentukan bagian skrip tempat Anda ingin PowerShell memantau kesalahan. Ketika kesalahan terjadi dalam blok try, kesalahan pertama kali disimpan ke variabel otomatis $Error. PowerShell kemudian mencari blok catch untuk menangani kesalahan. Jika pernyataan try tidak memiliki blok catch yang cocok, PowerShell terus mencari blok catch yang sesuai atau pernyataan trap dalam cakupan induk. Setelah blok catch selesai atau jika tidak ada blok catch yang sesuai atau pernyataan trap ditemukan, blok finally dijalankan. Jika kesalahan tidak dapat ditangani, kesalahan ditulis ke aliran kesalahan.

Blok catch dapat menyertakan perintah untuk melacak kesalahan atau untuk memulihkan alur skrip yang diharapkan. Blok catch dapat menentukan jenis kesalahan mana yang ditangkapnya. Pernyataan try dapat mencakup beberapa blok catch untuk berbagai jenis kesalahan.

Blok finally dapat digunakan untuk membebaskan sumber daya apa pun yang tidak lagi diperlukan oleh skrip Anda.

try, catch, dan finally menyerupai kata kunci try, catch, dan finally yang digunakan dalam bahasa pemrograman C#.

Syntax

Pernyataan try berisi blok try, nol atau lebih blok catch, dan nol atau satu blok finally. Pernyataan try harus memiliki setidaknya satu blok catch atau satu blok finally.

Berikut ini memperlihatkan sintaks blok try:

try {<statement list>}

Kata kunci try diikuti oleh daftar pernyataan dalam kurung kurawal. Jika terjadi kesalahan penghentian saat pernyataan dalam daftar pernyataan sedang dijalankan, skrip meneruskan objek kesalahan dari blok try ke blok catch yang sesuai.

Berikut ini memperlihatkan sintaks blok catch:

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

Jenis kesalahan muncul dalam tanda kurung siku. Tanda kurung terluar menunjukkan elemen bersifat opsional.

Kata kunci catch diikuti oleh daftar opsional spesifikasi jenis kesalahan dan daftar pernyataan. Jika kesalahan penghentian terjadi di blok try, PowerShell mencari blok catch yang sesuai. Jika ditemukan, pernyataan di blok catch dijalankan.

Blok catch dapat menentukan satu atau beberapa jenis kesalahan. Jenis kesalahan adalah pengecualian Microsoft .NET Framework atau pengecualian yang berasal dari pengecualian .NET Framework. Blok catch menangani kesalahan kelas pengecualian .NET Framework yang ditentukan atau kelas apa pun yang berasal dari kelas yang ditentukan.

Jika blok catch menentukan jenis kesalahan, blok catch tersebut menangani jenis kesalahan tersebut. Jika blok catch tidak menentukan jenis kesalahan, blok catch tersebut menangani kesalahan yang ditemui di blok try. Pernyataan try dapat menyertakan beberapa blok catch untuk berbagai jenis kesalahan yang ditentukan.

Berikut ini memperlihatkan sintaks blok finally:

finally {<statement list>}

Kata kunci finally diikuti oleh daftar pernyataan yang berjalan setiap kali skrip dijalankan, bahkan jika pernyataan try berjalan tanpa kesalahan atau kesalahan tertangkap dalam pernyataan catch.

Perhatikan bahwa menekan CTRL+C menghentikan alur. Objek yang dikirim ke alur tidak akan ditampilkan sebagai output. Oleh karena itu, jika Anda menyertakan pernyataan yang akan ditampilkan, seperti "Blok terakhir telah dijalankan", itu tidak akan ditampilkan setelah Anda menekan CTRL+C, bahkan jika blok finally berjalan.

Menangkap kesalahan

Contoh skrip berikut menunjukkan blok try dengan blok catch:

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

Kata kunci catch harus segera mengikuti blok try atau blok catch lainnya.

PowerShell tidak mengenali "NonsenseString" sebagai cmdlet atau item lainnya. Menjalankan skrip ini mengembalikan hasil berikut:

An error occurred.

Ketika skrip mengalami "NonsenseString", itu menyebabkan kesalahan yang mengakhiri. Blok catch menangani kesalahan dengan menjalankan daftar pernyataan di dalam blok.

MENGGUNAKAN BEBERAPA PERNYATAAN TANGKAPAN

Pernyataan try dapat memiliki sejumlah blok catch. Misalnya, skrip berikut memiliki blok try yang mengunduh MyDoc.doc, dan berisi dua blok catch:

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."
}

Blok catch pertama menangani kesalahan System.Net.WebException dan tipe System.IO.IOException. Blok catch kedua tidak menentukan jenis kesalahan. Blok catch kedua menangani kesalahan penghentian lain yang terjadi.

PowerShell cocok dengan jenis kesalahan berdasarkan pewarisan. Blok catch menangani kesalahan kelas pengecualian .NET Framework yang ditentukan atau kelas apa pun yang berasal dari kelas yang ditentukan. Contoh berikut berisi blok catch yang menangkap kesalahan "Perintah Tidak Ditemukan":

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

Jenis kesalahan yang ditentukan, commandNotFoundException, mewarisi dari jenis System.SystemException. Contoh berikut juga menangkap kesalahan Command Not Found:

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

Blok catch ini menangani kesalahan "Perintah Tidak Ditemukan" dan kesalahan lain yang mewarisi dari jenis SystemException.

Jika Anda menentukan kelas kesalahan dan salah satu kelas turunannya, letakkan blok catch untuk kelas turunan sebelum blok catch untuk kelas umum.

Nota

PowerShell membungkus semua pengecualian dalam jenis RuntimeException. Oleh karena itu, menentukan jenis kesalahan System.Management.Automation.RuntimeException berperilaku sama dengan blok tangkapan yang tidak memenuhi syarat.

Menggunakan perangkap dalam tangkapan percobaan

Ketika kesalahan penghentian terjadi di blok try dengan trap yang ditentukan dalam blok try, bahkan jika ada blok catch yang cocok, pernyataan trap mengambil kontrol.

Jika trap ada di blok yang lebih tinggi dari try, dan tidak ada blok catch yang cocok dalam cakupan saat ini, trap akan mengambil kontrol, bahkan jika ada cakupan induk yang memiliki blok catch yang cocok.

Mengakses informasi pengecualian

catch Dalam blok, kesalahan saat ini dapat diakses menggunakan $_ variabel atau $PSItem otomatis. Objek berjenis ErrorRecord.

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

Menjalankan skrip ini mengembalikan hasil berikut:

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.

Ada properti tambahan yang dapat diakses, seperti ScriptStackTrace, Exception, dan ErrorDetails. Misalnya, jika kita mengubah skrip menjadi yang berikut:

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

Hasilnya akan mirip dengan:

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

Membebaskan sumber daya menggunakan akhirnya

Untuk membebaskan sumber daya yang digunakan oleh skrip, tambahkan blok finally setelah blok try dan catch. Pernyataan blok finally berjalan terlepas dari apakah blok try mengalami kesalahan yang mengakhiri. PowerShell menjalankan blok finally sebelum skrip berakhir atau sebelum blok saat ini keluar dari cakupan.

Blok finally berjalan bahkan jika Anda menggunakan CTRL+C untuk menghentikan skrip. Blok finally juga berjalan jika kata kunci exit menghentikan skrip dari dalam blok catch.

Dalam contoh berikut, blok try mencoba mengunduh file ke folder C:\temp. Blok catch menangani kesalahan yang terjadi selama pengunduhan. Blok finally membuang objek WebClient dan menghapus file sementara jika ada.

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 }
}

Lihat juga