about_Try_Catch_Finally
Deskripsi singkat
Menjelaskan cara menggunakan try
blok , catch
, dan finally
untuk menangani kesalahan penghentian.
Deskripsi panjang
Gunakan try
blok , 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 try
kata kunci , , catch
dan 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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk