about_Try_Catch_Finally

Deskripsi singkat

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

Deskripsi panjang

Gunakan tryblok , catch, dan finally untuk merespons atau menangani kesalahan penghentian dalam skrip. Pernyataan ini Trap juga dapat digunakan untuk menangani kesalahan penghentian dalam skrip. Untuk informasi selengkapnya, lihat about_Trap.

Kesalahan penghentian menghentikan pernyataan agar tidak berjalan. Jika PowerShell tidak menangani kesalahan penghentian dalam beberapa cara, PowerShell juga berhenti menjalankan fungsi atau skrip menggunakan alur saat ini. Dalam bahasa lain, seperti C#, mengakhiri kesalahan disebut sebagai pengecualian.

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

catch Blok dapat mencakup 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 catch blok untuk berbagai jenis kesalahan.

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

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

Sintaks

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

Berikut ini memperlihatkan try sintaks blok:

try {<statement list>}

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

Berikut ini memperlihatkan catch sintaks blok:

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

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

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

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

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

Berikut ini memperlihatkan finally sintaks blok:

finally {<statement list>}

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

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 "Akhirnya blok telah berjalan", itu tidak akan ditampilkan setelah Anda menekan CTRL+C, bahkan jika finally blok berjalan.

Kesalahan penangkapan

Contoh skrip berikut menunjukkan try blok dengan catch blok:

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

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

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 catch blok. Misalnya, skrip berikut memiliki try blok yang mengunduh MyDoc.doc, dan berisi dua catch blok:

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

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

PowerShell cocok dengan jenis kesalahan berdasarkan pewarisan. catch Blok menangani kesalahan kelas pengecualian .NET Framework yang ditentukan atau kelas apa pun yang berasal dari kelas yang ditentukan. Contoh berikut berisi catch blok 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 ini catch menangani kesalahan "Perintah Tidak Ditemukan" dan kesalahan lain yang mewarisi dari jenis SystemException .

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

Catatan

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 Try Catch

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

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

Mengakses informasi pengecualian

catch Dalam blok, kesalahan saat ini dapat diakses menggunakan $_, yang juga dikenal sebagai $PSItem. 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 finally blok setelah try dan catch blok. Pernyataan finally blok berjalan terlepas dari apakah try blok mengalami kesalahan yang mengakhiri. PowerShell menjalankan finally blok sebelum skrip berakhir atau sebelum blok saat ini keluar dari cakupan.

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

Lihat juga