Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Deskripsi singkat
Menjelaskan kata kunci yang menangani kesalahan penghentian.
Deskripsi panjang
Kesalahan fatal menghentikan eksekusi pernyataan. Jika PowerShell tidak menangani kesalahan penghentian dalam beberapa cara, PowerShell juga berhenti menjalankan fungsi atau skrip di alur saat ini. Dalam bahasa lain, seperti C#, mengakhiri kesalahan dikenal sebagai pengecualian.
Kata kunci trap menentukan daftar pernyataan yang akan dijalankan saat terjadi kesalahan penghentian.
trap perintah dapat menangani kesalahan penghentian dengan cara berikut:
Tampilkan kesalahan setelah memproses blok pernyataan
trapdan melanjutkan eksekusi skrip atau fungsi yang berisitrap. Perilaku ini adalah default.Nota
Ketika kesalahan penghentian terjadi di blok pernyataan subordinat, seperti
ifpernyataan atauforeachperulangan, pernyataan dalamtrapblok dijalankan dan eksekusi berlanjut pada pernyataan berikutnya di luar blok bawahan.Tampilkan kesalahan dan batalkan eksekusi skrip atau fungsi yang berisi
trapmenggunakanbreakdalam pernyataantrap.Senyapkan kesalahan, tetapi lanjutkan eksekusi skrip atau fungsi yang berisi
trapdengan menggunakancontinuedalam pernyataantrap.
Daftar pernyataan trap dapat mencakup beberapa kondisi atau panggilan fungsi.
trap dapat menulis log, kondisi pengujian, atau bahkan menjalankan program lain.
Sintaksis
Pernyataan trap memiliki sintaks berikut:
trap [[<error type>]] {<statement list>}
Pernyataan trap menyertakan daftar pernyataan yang akan dijalankan saat terjadi kesalahan penghentian. Pernyataan trap terdiri dari kata kunci trap, secara opsional diikuti oleh ekspresi jenis, dan blok pernyataan yang berisi daftar pernyataan yang akan dijalankan saat kesalahan terperangkap. Ekspresi jenis menyempurnakan jenis kesalahan yang ditangkap oleh trap.
Skrip atau perintah dapat memiliki beberapa pernyataan trap.
trap pernyataan dapat muncul di mana saja dalam skrip atau perintah.
Menjebak semua kesalahan penghentian
Saat terjadi kesalahan penghentian yang tidak ditangani dengan cara lain dalam skrip atau perintah, PowerShell memeriksa pernyataan trap yang menangani kesalahan. Jika ada pernyataan trap, PowerShell terus menjalankan skrip atau perintah dalam pernyataan trap.
Contoh berikut adalah pernyataan minimal trap:
trap { 'Error found.' }
Pernyataan trap ini menangani kesalahan yang menghentikan.
Dalam contoh berikut, fungsi menyertakan string omong kosong yang menyebabkan kesalahan saat runtime.
function TrapTest {
trap { 'Error found.' }
nonsenseString
}
TrapTest
Menjalankan fungsi ini mengembalikan output berikut:
Error found.
nonsenseString:
Line |
3 | nonsenseString
| ~~~~~~~~~~~~~~
| The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
Contoh berikut menyertakan trap pernyataan yang menampilkan kesalahan dengan menggunakan $_ variabel atau $PSItem otomatis:
function TrapTest {
trap { "Error found: $_" }
nonsenseString
}
TrapTest
Menjalankan versi fungsi ini mengembalikan output berikut:
Error found: 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.
nonsenseString:
Line |
3 | nonsenseString
| ~~~~~~~~~~~~~~
| The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
Penting
trap pernyataan dapat didefinisikan di mana saja dalam blok skrip tertentu, tetapi selalu berlaku untuk semua pernyataan dalam blok skrip tersebut. Pada runtime, pernyataan trap dalam blok didefinisikan sebelum pernyataan lain dijalankan.
Dalam bahasa lain, seperti JavaScript, ini dikenal sebagai hoisting. Ini berarti bahwa pernyataan trap berlaku untuk semua pernyataan dalam blok itu bahkan jika eksekusi belum maju melewati titik di mana pernyataan tersebut ditentukan. Misalnya, menentukan trap di akhir skrip dan menghasilkan kesalahan pada pernyataan pertama tetap memicu trapitu.
Menangkap kesalahan tertentu
Skrip atau perintah dapat memiliki beberapa pernyataan trap.
trap dapat didefinisikan untuk menangani kesalahan tertentu.
Contoh berikut adalah pernyataan trap yang menjebak kesalahan spesifik CommandNotFoundException:
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
Saat fungsi atau skrip menemukan string yang tidak cocok dengan perintah yang diketahui, pernyataan trap ini menampilkan string Command error trapped.
Setelah menjalankan daftar pernyataan trap, PowerShell menulis objek kesalahan ke aliran kesalahan lalu melanjutkan skrip.
PowerShell menggunakan jenis pengecualian .NET. Contoh berikut menentukan jenis kesalahan System.Exception:
trap [System.Exception] { 'An error trapped' }
Jenis kesalahan CommandNotFoundException mewarisi dari System.Exception. Pernyataan ini menjebak kesalahan apa pun yang dimunculkan oleh perintah yang tidak diketahui. Ini juga menjebak jenis kesalahan lainnya.
Anda dapat menemukan jenis pengecualian untuk kesalahan dengan memeriksa objek kesalahan. Contoh berikut menunjukkan cara mendapatkan nama lengkap pengecualian untuk kesalahan terakhir dalam sesi:
nonsenseString
$Error[0].Exception.GetType().FullName
nonsenseString: The term 'nonsenseString' is not recognized as a name of a
cmdlet, function, script file, or executable program. Check the spelling
of the name, or if a path was included, verify that the path is correct
and try again.
System.Management.Automation.CommandNotFoundException
Anda dapat memiliki lebih dari satu pernyataan trap dalam skrip. Hanya satu pernyataan trap yang dapat menjebak setiap jenis kesalahan. Ketika kesalahan penghentian terjadi, PowerShell mencari dengan kecocokan trap yang paling spesifik, dimulai dari blok skrip eksekusi saat ini.
Contoh skrip berikut berisi kesalahan. Skrip ini mencakup pernyataan trap umum yang menjebak kesalahan penghentian dan pernyataan trap tertentu yang menentukan jenis CommandNotFoundException.
trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
nonsenseString
Menjalankan skrip ini menghasilkan hasil berikut:
Command error trapped
nonsenseString:
Line |
5 | nonsenseString
| ~~~~~~~~~~~~~~
| The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
Karena PowerShell tidak mengenali nonsenseString sebagai cmdlet atau item lainnya, PowerShell mengembalikan kesalahan CommandNotFoundException. Pernyataan trap spesifik menjebak kesalahan penghentian ini.
Contoh skrip berikut berisi pernyataan trap yang sama dengan kesalahan yang berbeda:
trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
1/$null
Menjalankan skrip ini menghasilkan hasil berikut:
Other terminating error trapped
RuntimeException:
Line |
5 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
Upaya untuk membagi dengan nol tidak membuat kesalahan CommandNotFoundException. Pernyataan trap lainnya, yang menangkap kesalahan yang mengakhiri proses, menangkap kesalahan pembagian dengan nol.
Kesalahan trapping dalam blok skrip
Secara default, ketika kesalahan penghentian dilemparkan, eksekusi ditransfer ke pernyataan trap. Setelah blok trap dijalankan, kontrol kembali ke blok pernyataan berikutnya setelah lokasi kesalahan.
Misalnya, ketika kesalahan penghentian terjadi dalam pernyataan foreach , trap pernyataan dijalankan dan eksekusi berlanjut pada pernyataan berikutnya setelah foreach blok, tidak dalam foreach blok.
trap { 'An error occurred!'}
foreach ($x in 3..-1) {
"1/$x = "
"`t$(1/$x)"
}
'after loop'
1/3 =
0.333333333333333
1/2 =
0.5
1/1 =
1
1/0 =
An error occurred!
RuntimeException:
Line |
4 | "`t$(1/$x)"
| ~~~~
| Attempted to divide by zero.
after loop
Dalam output, Anda dapat melihat perulangan berlanjut hingga iterasi terakhir. Ketika skrip mencoba membagi 1 dengan 0, PowerShell melemparkan kesalahan fatal. Skrip melewati sisa foreach pernyataan, menjalankan try pernyataan, dan berlanjut setelah foreach pernyataan.
Penanganan kesalahan dan ruang lingkup
Jika kesalahan penghentian terjadi dalam blok skrip yang sama dengan trap pernyataan, PowerShell menjalankan daftar pernyataan yang ditentukan oleh trap. Eksekusi berlanjut pada pernyataan setelah kesalahan.
trap Jika pernyataan berada dalam blok skrip yang berbeda dari kesalahan, eksekusi berlanjut pada pernyataan berikutnya yang berada dalam blok skrip yang sama dengan trap pernyataan .
Misalnya, jika kesalahan terjadi dalam fungsi, dan pernyataan trap ada dalam fungsi , skrip berlanjut pada pernyataan berikutnya. Skrip berikut berisi kesalahan dan pernyataan trap:
function function1 {
trap { 'An error: ' }
NonsenseString
'function1 was completed'
}
function1
Menjalankan skrip ini menghasilkan hasil berikut:
An error:
NonsenseString:
Line |
3 | NonsenseString
| ~~~~~~~~~~~~~~
| The term 'NonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
function1 was completed
Pernyataan trap dalam fungsi menangkap kesalahan. Setelah menampilkan pesan, PowerShell melanjutkan menjalankan fungsi. Perhatikan bahwa Function1 selesai setelah pernyataan trap.
Bandingkan perilaku ini dengan contoh berikut, yang memiliki kesalahan dan pernyataan trap yang sama. Dalam contoh ini, pernyataan trap terjadi di luar fungsi:
function function2 {
NonsenseString
'function2 was completed'
}
trap { 'An error:' }
function2
Menjalankan fungsi Function2 menghasilkan hasil berikut:
An error:
NonsenseString:
Line |
2 | NonsenseString
| ~~~~~~~~~~~~~~
| The term 'NonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
Dalam contoh ini, perintah function2 was completed tidak dijalankan. Dalam kedua contoh, kesalahan penghentian terjadi dalam fungsi. Namun, dalam contoh ini, pernyataan trap berada di luar fungsi. PowerShell tidak kembali ke fungsi setelah pernyataan trap berjalan.
Perhatian
Ketika beberapa perangkap didefinisikan untuk kondisi kesalahan yang sama, yang pertama trap ditentukan secara leksikal (tertinggi dalam blok skrip) digunakan.
Dalam contoh berikut, hanya trap dan whoops 1 yang berfungsi.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }
Penting
Pernyataan trap tercakup pada tempatnya saat dikompilasi. Jika Anda memiliki pernyataan trap di dalam fungsi atau skrip yang menggunakan sumber titik, saat fungsi atau skrip tersebut keluar, semua pernyataan trap di dalamnya akan dihapus.
Menggunakan kata kunci break dan continue
Anda dapat menggunakan kata kunci break dan continue dalam pernyataan trap untuk menentukan apakah skrip atau perintah terus berjalan setelah kesalahan yang mengakhiri.
Jika Anda menyertakan pernyataan break dalam daftar pernyataan trap, PowerShell akan menghentikan fungsi atau skrip. Contoh fungsi berikut menggunakan kata kunci break dalam pernyataan trap:
function break_example {
trap {
'Error trapped'
break
}
1/$null
'Function completed.'
}
break_example
Error trapped
ParentContainsErrorRecordException:
Line |
6 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
Karena pernyataan trap menyertakan kata kunci break, fungsi tidak terus berjalan, dan baris Function completed tidak dijalankan.
Jika Anda menyertakan kata kunci continue dalam pernyataan trap, PowerShell melanjutkan setelah pernyataan yang menyebabkan kesalahan, seperti halnya tanpa break atau continue. Namun, PowerShell tidak menulis kesalahan ke aliran kesalahan dengan kata kunci continue.
Contoh fungsi berikut menggunakan kata kunci continue dalam pernyataan trap:
function ContinueExample {
trap {
'Error trapped'
continue
}
foreach ($x in 3..-1) {
"1/$x = "
"`t$(1/$x)"
}
'End of function'
}
ContinueExample
1/3 =
0.333333333333333
1/2 =
0.5
1/1 =
1
1/0 =
Error trapped
End of function
Fungsi dilanjutkan kembali setelah kesalahan terperangkap, dan pernyataan End of function dijalankan. Tidak ada kesalahan yang ditulis ke aliran kesalahan.
Catatan
trap pernyataan menyediakan cara untuk memastikan semua kesalahan yang mengakhiri dalam scriptblock ditangani. Untuk penanganan kesalahan yang lebih halus, gunakan try/catch blok di mana perangkap didefinisikan menggunakan catch pernyataan. Pernyataan catch hanya berlaku untuk kode di dalam pernyataan try terkait. Untuk informasi lebih lanjut, lihat about_Try_Catch_Finally.