Bagikan melalui


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 berisi trap. Perilaku ini adalah default.

    Catatan

    Ketika kesalahan penghentian terjadi di blok skrip subordinat, seperti if pernyataan atau foreach perulangan, pernyataan di trap 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 dalam trap pernyataan.

  • Bungkam kesalahan, tetapi lanjutkan eksekusi skrip atau fungsi yang trap berisi dengan menggunakan continue dalam trap 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.

Lihat juga