about_Trap
Deskripsi singkat
Menjelaskan kata kunci yang menangani kesalahan penghentian.
Deskripsi panjang
Kesalahan penghentian menghentikan pernyataan agar tidak berjalan. 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 trap
kunci menentukan daftar pernyataan yang akan dijalankan saat terjadi kesalahan penghentian. trap
pernyataan dapat menangani kesalahan penghentian dengan cara berikut:
Tampilkan kesalahan setelah memproses
trap
blok pernyataan dan melanjutkan eksekusi skrip atau fungsi yang berisitrap
. Perilaku ini adalah default.Catatan
Ketika kesalahan penghentian terjadi di blok skrip subordinat, seperti
if
pernyataan atauforeach
perulangan, pernyataan ditrap
blok dijalankan dan eksekusi berlanjut pada pernyataan berikutnya di luar blok skrip subordinat.Tampilkan kesalahan dan batalkan eksekusi skrip atau fungsi yang berisi penggunaan
trap
break
dalamtrap
pernyataan.Bungkam kesalahan, tetapi lanjutkan eksekusi skrip atau fungsi yang
trap
berisi dengan menggunakancontinue
dalamtrap
pernyataan.
Daftar trap
pernyataan dapat mencakup beberapa kondisi atau panggilan fungsi. Dapat trap
menulis log, kondisi pengujian, atau bahkan menjalankan program lain.
Sintaks
Pernyataan trap
memiliki sintaks berikut:
trap [[<error type>]] {<statement list>}
Pernyataan ini trap
mencakup daftar pernyataan yang akan dijalankan saat terjadi kesalahan penghentian. Pernyataan trap
terdiri dari trap
kata kunci, 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 trap
.
Skrip atau perintah dapat memiliki beberapa trap
pernyataan. trap
pernyataan dapat muncul di mana saja dalam skrip atau perintah.
Menjebak semua kesalahan yang mengakhiri
Saat terjadi kesalahan penghentian yang tidak ditangani dengan cara lain dalam skrip atau perintah, PowerShell memeriksa trap
pernyataan yang menangani kesalahan. Jika ada trap
pernyataan, PowerShell terus menjalankan skrip atau perintah dalam trap
pernyataan.
Contoh berikut adalah pernyataan minimal trap
:
trap { 'Error found.' }
Pernyataan ini trap
menjebak kesalahan penghentian apa pun.
Dalam contoh berikut, fungsi menyertakan string omong kosong yang menyebabkan kesalahan 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 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, trap
pernyataan dalam blok didefinisikan sebelum pernyataan lain dijalankan.
Di JavaScript, ini dikenal sebagai hoisting. Ini berarti bahwa trap
pernyataan berlaku untuk semua pernyataan dalam blok itu bahkan jika eksekusi belum maju melewati titik di mana mereka didefinisikan. Misalnya, menentukan trap
di akhir skrip dan melemparkan kesalahan dalam pernyataan pertama masih memicu bahwa trap
.
Menjebak kesalahan tertentu
Skrip atau perintah dapat memiliki beberapa trap
pernyataan. trap
Dapat didefinisikan untuk menangani kesalahan tertentu.
Contoh berikut adalah trap
pernyataan 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 ini trap
menampilkan Command error trapped
string.
Setelah menjalankan trap
daftar pernyataan, 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 jenis 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 trap
pernyataan dalam skrip. Hanya satu trap
pernyataan yang dapat menjebak setiap jenis kesalahan. Ketika kesalahan penghentian terjadi, PowerShell mencari dengan kecocokan trap
yang paling spesifik, dimulai di blok skrip eksekusi saat ini.
Contoh skrip berikut berisi kesalahan. Skrip mencakup pernyataan umum trap
yang menjebak kesalahan penghentian dan pernyataan tertentu trap
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 dikenali nonsenseString
sebagai cmdlet atau item lain, PowerShell mengembalikan kesalahan CommandNotFoundException . Pernyataan spesifik trap
menjebak kesalahan penghentian ini.
Contoh skrip berikut berisi pernyataan yang sama trap
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 lain trap
, yang menjebak kesalahan yang mengakhiri, menjebak kesalahan dibagi dengan nol.
Kesalahan trapping dalam blok skrip
Secara default, ketika kesalahan penghentian dilemparkan, eksekusi ditransfer ke pernyataan trap. trap
Setelah blok 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 yang mengakhiri. Skrip melewati sisa foreach
blok skrip, menjalankan try
pernyataan, dan berlanjut setelah foreach
blok skrip.
Kesalahan dan cakupan trapping
Jika kesalahan penghentian terjadi di 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 di blok skrip yang sama dengan trap
pernyataan.
Misalnya, jika kesalahan terjadi dalam fungsi, dan trap
pernyataan berada dalam fungsi , skrip berlanjut pada pernyataan berikutnya. Skrip berikut berisi kesalahan dan trap
pernyataan:
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 menjebak kesalahan. Setelah menampilkan pesan, PowerShell melanjutkan menjalankan fungsi. Perhatikan bahwa Function1
selesai setelah trap
pernyataan.
Bandingkan perilaku ini dengan contoh berikut, yang memiliki kesalahan dan trap
pernyataan yang sama. Dalam contoh ini, trap
pernyataan terjadi di luar fungsi:
function function2 {
NonsenseString
'function2 was completed'
}
trap { 'An error:' }
function2
Function2
Menjalankan fungsi 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, function2 was completed
perintah tidak dijalankan. Dalam kedua contoh, kesalahan penghentian terjadi dalam fungsi. Namun, dalam contoh ini, trap
pernyataan berada di luar fungsi. PowerShell tidak kembali ke fungsi setelah trap
pernyataan berjalan.
Perhatian
Ketika beberapa perangkap didefinisikan untuk kondisi kesalahan yang sama, yang pertama trap
ditentukan secara leksikal (tertinggi di blok skrip) digunakan.
Dalam contoh berikut, hanya dengan trap
whoops 1
eksekusi.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }
Penting
Pernyataan trap
dilingkup ke tempatnya dikompilasi. Jika Anda memiliki trap
pernyataan di dalam fungsi atau skrip bersumber titik, ketika fungsi atau skrip bersumber titik keluar, semua trap
pernyataan di dalamnya akan dihapus.
Menggunakan kata kunci jeda dan lanjutkan
Anda dapat menggunakan break
kata kunci dan continue
dalam trap
pernyataan untuk menentukan apakah skrip atau perintah terus berjalan setelah kesalahan yang mengakhiri.
Jika Anda menyertakan break
pernyataan dalam trap
daftar pernyataan, PowerShell akan menghentikan fungsi atau skrip. Contoh fungsi berikut menggunakan break
kata kunci dalam trap
pernyataan:
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.
trap
Karena pernyataan menyertakan break
kata kunci, fungsi tidak terus berjalan, dan Function completed
baris tidak dijalankan.
Jika Anda menyertakan continue
kata kunci dalam trap
pernyataan, PowerShell melanjutkan setelah pernyataan yang menyebabkan kesalahan, seperti halnya tanpa break
atau continue
. continue
Namun, dengan kata kunci, PowerShell tidak menulis kesalahan ke aliran kesalahan.
Contoh fungsi berikut menggunakan continue
kata kunci dalam trap
pernyataan:
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 setelah kesalahan terperangkap, dan End of function
pernyataan berjalan. Tidak ada kesalahan yang ditulis ke aliran kesalahan.
Catatan
trap
pernyataan menyediakan cara untuk memastikan semua kesalahan penghentian dalam blok skrip 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 terkait try
. Untuk informasi selengkapnya, lihat about_Try_Catch_Finally.