เกี่ยวกับ ลองจับในที่สุด
คำอธิบายสั้น ๆ
อธิบายวิธีใช้บล็อก try, catch และ finally เพื่อจัดการกับข้อผิดพลาดในการยุติ
คำอธิบายยาว
ใช้บล็อก try, catch และ finally เพื่อตอบสนองหรือจัดการข้อผิดพลาดในการยุติในสคริปต์ คำสั่ง Trap ยังสามารถใช้เพื่อจัดการกับข้อผิดพลาดในการยุติในสคริปต์ สำหรับข้อมูลเพิ่มเติม โปรดดู about_Trap
ข้อผิดพลาดในการสิ้นสุดจะหยุดคำสั่งไม่ให้ทำงาน หาก PowerShell ไม่สามารถจัดการข้อผิดพลาดในการยุติได้ในทางใดทางหนึ่ง PowerShell จะหยุดเรียกใช้ฟังก์ชันหรือสคริปต์โดยใช้ไปป์ไลน์ปัจจุบันด้วย ในภาษาอื่นๆ เช่น C# ข้อผิดพลาดในการยกเลิกจะเรียกว่าข้อยกเว้น
ใช้บล็อก ลอง เพื่อกำหนดส่วนของสคริปต์ที่คุณต้องการให้ PowerShell ตรวจสอบข้อผิดพลาด เมื่อมีข้อผิดพลาดเกิดขึ้นภายในบล็อก try ข้อผิดพลาดจะถูกบันทึกลงในตัวแปรอัตโนมัติ $Error ก่อน PowerShell ค้นหาบล็อก catch เพื่อจัดการกับข้อผิดพลาด หากคำสั่ง ลอง ไม่มีบล็อก catch ที่ตรงกัน PowerShell ยังคงค้นหาบล็อก catch หรือ Trap คำสั่งในขอบเขตหลัก หลังจากที่บล็อก catch เสร็จสมบูรณ์ หรือหากไม่พบบล็อก catch หรือคำสั่ง Trap ที่เหมาะสม บล็อก finally จะถูก วิ่ง. หากไม่สามารถจัดการข้อผิดพลาดได้ ข้อผิดพลาดจะถูกเขียนไปยังสตรีมข้อผิดพลาด
บล็อก catch สามารถรวมคำสั่งสำหรับติดตามข้อผิดพลาดหรือสำหรับการกู้คืนโฟลว์ที่คาดหวังของสคริปต์ บล็อก catch สามารถระบุประเภทข้อผิดพลาดที่จะตรวจจับได้ คำสั่ง try สามารถรวมบล็อก catch หลายบล็อกสำหรับข้อผิดพลาดประเภทต่างๆ
คุณสามารถใช้บล็อก สุดท้าย เพื่อเพิ่มทรัพยากรใดๆ ที่สคริปต์ของคุณไม่ต้องการอีกต่อไป
ลอง, catch และ ในที่สุด มีลักษณะคล้ายกับ try, catch และ สุดท้าย คำหลักที่ใช้ในภาษาการเขียนโปรแกรม C#
ไวยากรณ์
คำสั่ง try ประกอบด้วยบล็อก try บล็อก catch เป็นศูนย์หรือมากกว่า และบล็อก สุดท้าย เป็นศูนย์หรือหนึ่งบล็อก คำสั่ง try ต้องมีอย่างน้อยหนึ่งบล็อก catch หรือหนึ่งบล็อก finally
ต่อไปนี้แสดงไวยากรณ์ของบล็อก try:
try {<statement list>}
คำหลัก try ตามด้วยรายการคำสั่งในวงเล็บปีกกา หากข้อผิดพลาดในการสิ้นสุดเกิดขึ้นในขณะที่คำสั่งในรายการคำสั่งกำลังทำงานอยู่ สคริปต์จะส่งผ่านออบเจ็กต์ข้อผิดพลาดจากบล็อก try ไปยังบล็อก catch ที่เหมาะสม
ต่อไปนี้แสดงไวยากรณ์ของบล็อก catch:
catch [[<error type>][',' <error type>]*] {<statement list>}
ประเภทข้อผิดพลาดปรากฏในวงเล็บ วงเล็บด้านนอกสุดระบุว่าองค์ประกอบนั้นเป็นทางเลือก
คำหลัก catch ตามด้วยรายการเพิ่มเติมของข้อกำหนดประเภทข้อผิดพลาดและรายการคำสั่ง หากมีข้อผิดพลาดในการสิ้นสุดเกิดขึ้นในบล็อก ลอง PowerShell จะค้นหาบล็อก catch ที่เหมาะสม หากพบ คำสั่งในบล็อก catch จะถูกดำเนินการ
บล็อก catch สามารถระบุประเภทข้อผิดพลาดตั้งแต่หนึ่งประเภทขึ้นไป ชนิดของข้อผิดพลาดคือข้อยกเว้นของ Microsoft .NET Framework หรือข้อยกเว้นที่ได้มาจากข้อยกเว้นของ .NET Framework บล็อก catch จัดการข้อผิดพลาดของคลาสข้อยกเว้น .NET Framework ที่ระบุหรือคลาสใด ๆ ที่ได้มาจากคลาสที่ระบุ
หากบล็อก catch ระบุประเภทข้อผิดพลาด บล็อก catch จะจัดการกับข้อผิดพลาดประเภทนั้น หากบล็อก catch ไม่ได้ระบุประเภทข้อผิดพลาด บล็อก catch จะจัดการกับข้อผิดพลาดใดๆ ที่พบในบล็อก try คำสั่ง try สามารถรวมบล็อก catch หลายบล็อกสำหรับประเภทข้อผิดพลาดที่ระบุที่แตกต่างกัน
ต่อไปนี้แสดงไวยากรณ์ของบล็อก ในที่สุด:
finally {<statement list>}
คำหลัก finally ตามด้วยรายการคำสั่งที่ทำงานทุกครั้งที่เรียกใช้สคริปต์ แม้ว่าคำสั่ง try จะรันโดยไม่มีข้อผิดพลาดหรือพบข้อผิดพลาดใน คำสั่ง catch
โปรดทราบว่าการกด CTRL+C จะหยุดไปป์ไลน์ ออบเจ็กต์ที่ส่งไปยังไปป์ไลน์จะไม่แสดงเป็นเอาต์พุต ดังนั้น หากคุณรวมคำสั่งที่จะแสดง เช่น "Finally block has run" คำสั่งนั้นจะไม่แสดงหลังจากที่คุณกด CTRL+C แม้ว่าปุ่ม ในที่สุด บล็อกก็ทำงาน
การจับข้อผิดพลาด
สคริปต์ตัวอย่างต่อไปนี้แสดงบล็อก try พร้อมด้วยบล็อก catch:
try { NonsenseString }
catch { "An error occurred." }
คีย์เวิร์ด catch ต้องตามหลังบล็อก try หรือบล็อก catch อื่นทันที
PowerShell ไม่รู้จัก "NonsenseString" เป็น cmdlet หรือรายการอื่น การรันสคริปต์นี้จะส่งกลับผลลัพธ์ต่อไปนี้:
An error occurred.
เมื่อสคริปต์พบ "NonsenseString" จะทำให้เกิดข้อผิดพลาดในการสิ้นสุด บล็อก catch จัดการข้อผิดพลาดโดยการเรียกใช้รายการคำสั่งภายในบล็อก
การใช้คำสั่ง catch หลายรายการ
คำสั่ง try สามารถมีจำนวนบล็อก catch เท่าใดก็ได้ ตัวอย่างเช่น สคริปต์ต่อไปนี้มีบล็อก try ที่ดาวน์โหลด MyDoc.doc และประกอบด้วยบล็อก catch สองบล็อก:
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."
}
บล็อก catch แรกจะจัดการข้อผิดพลาดของประเภท System.Net.WebException และ System.IO.IOException บล็อก catch ที่สองไม่ได้ระบุประเภทข้อผิดพลาด บล็อก catch ที่สองจะจัดการกับข้อผิดพลาดในการยุติอื่นๆ ที่เกิดขึ้น
PowerShell จับคู่ประเภทข้อผิดพลาดตามการสืบทอด บล็อก catch จัดการข้อผิดพลาดของคลาสข้อยกเว้น .NET Framework ที่ระบุหรือคลาสใด ๆ ที่ได้มาจากคลาสที่ระบุ ตัวอย่างต่อไปนี้ประกอบด้วยบล็อก catch ที่จับข้อผิดพลาด "Command Not Found":
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
ประเภทข้อผิดพลาดที่ระบุ CommandNotFoundException สืบทอดมาจากประเภท System.SystemException ตัวอย่างต่อไปนี้ยังตรวจพบข้อผิดพลาด Command Not Found:
catch [System.SystemException] {"Base Exception" }
บล็อก catch นี้จัดการข้อผิดพลาด "Command Not Found" และข้อผิดพลาดอื่นๆ ที่สืบทอดมาจากประเภท SystemException
หากคุณระบุคลาสข้อผิดพลาดและคลาสที่ได้รับคลาสใดคลาสหนึ่ง ให้วางบล็อก catch สำหรับคลาสที่ได้รับก่อนบล็อก catch สำหรับคลาสทั่วไป
บันทึก
PowerShell ล้อมข้อยกเว้นทั้งหมดในประเภท RuntimeException ดังนั้น การระบุประเภทข้อผิดพลาด System.Management.Automation.RuntimeException จะทำงานเหมือนกับบล็อก catch ที่ไม่มีเงื่อนไข
การใช้กับดักในการลองจับ
เมื่อเกิดข้อผิดพลาดในการสิ้นสุดในบล็อก try โดยมี Trap กำหนดไว้ภายในบล็อก try แม้ว่าจะมี catch ที่ตรงกันก็ตาม บล็อก คำสั่ง Trap เข้าควบคุม
หากมี Trap อยู่ที่บล็อกที่สูงกว่า try และไม่มีบล็อก catch ที่ตรงกันภายในขอบเขตปัจจุบัน Trap จะเข้าควบคุม แม้ว่าขอบเขตหลักจะมีบล็อก catch ที่ตรงกันก็ตาม
การเข้าถึงข้อมูลข้อยกเว้น
ภายในบล็อก catch ข้อผิดพลาดปัจจุบันสามารถเข้าถึงได้โดยใช้ $_ ซึ่งเรียกอีกอย่างว่า $PSItem ออบเจ็กต์เป็นประเภท ErrorRecord
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_
}
การรันสคริปต์นี้จะส่งกลับผลลัพธ์ต่อไปนี้:
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.
มีคุณสมบัติเพิ่มเติมที่สามารถเข้าถึงได้ เช่น ScriptStackTrace, Exception และ ErrorDetails ตัวอย่างเช่น ถ้าเราเปลี่ยนสคริปต์ดังต่อไปนี้:
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
ผลลัพธ์จะคล้ายกับ:
An Error occurred:
at <ScriptBlock>, <No file>: line 2
การเพิ่มทรัพยากรให้ใช้งานได้ในที่สุด
หากต้องการเพิ่มทรัพยากรที่ใช้โดยสคริปต์ ให้เพิ่มบล็อก สุดท้าย หลังบล็อก try และ catch คำสั่งบล็อก สุดท้าย ทำงานโดยไม่คำนึงว่าบล็อก ลอง พบข้อผิดพลาดในการสิ้นสุดหรือไม่ PowerShell รันบล็อก สุดท้าย ก่อนที่สคริปต์จะยุติหรือก่อนที่บล็อกปัจจุบันจะออกนอกขอบเขต
บล็อก สุดท้าย จะทำงานแม้ว่าคุณจะใช้ CTRL+C เพื่อหยุดสคริปต์ บล็อก สุดท้าย จะทำงานหากคีย์เวิร์ด Exit หยุดสคริปต์จากภายในบล็อก catch
ดูเพิ่มเติม
- about_Break
- เกี่ยวกับ_ดำเนินการต่อ
- about_ขอบเขต
- เกี่ยวกับ_โยน
- about_Trap