try catch ที่เพิ่มเข้ามาใหม่ใน sql server 2005 สามารถตรวจจับข้อยกเว้นได้อย่างง่ายดาย ฉันจะดูมันในวันนี้และสรุปประเด็นสำคัญดังนี้
BEGIN TRY
{ sql_statement |
คำสั่ง_บล็อก }
สิ้นสุดการลอง
เริ่มจับ
{ sql_statement |
คำสั่ง_บล็อก }
จบการจับ
คล้ายกับการใช้การจัดการข้อยกเว้นในภาษาทั่วไป แต่ควรสังเกตว่า SQL SERVER จะจับเฉพาะข้อยกเว้นที่ไม่ร้ายแรงเท่านั้น เมื่อไม่สามารถเชื่อมต่อข้อยกเว้น เช่น ฐานข้อมูล ฯลฯ ก็ไม่สามารถตรวจจับได้ ตัวอย่างคือ: เริ่มลอง
ประกาศ @X INT
-- หารด้วยศูนย์เพื่อสร้างข้อผิดพลาด
SET @X = 1/0
พิมพ์ 'คำสั่งหลังจากเกิดข้อผิดพลาดในบล็อก TRY'
สิ้นสุดการลอง
เริ่มจับ
พิมพ์ 'ตรวจพบข้อผิดพลาด'
จบการจับ
พิมพ์ 'คำสั่งหลังจากบล็อก TRY / CATCH'
นอกจากนี้ try catch สามารถซ้อนอยู่ใน Begin TRY ได้
ลบออกจาก GrandParent โดยที่ Name = 'John Smith'
พิมพ์ 'ปู่ย่าตายายลบเรียบร้อยแล้ว'
สิ้นสุดการลอง
เริ่มจับ
พิมพ์ 'ข้อผิดพลาดในการลบบันทึกปู่ย่าตายาย'
เริ่มลอง
ลบออกจาก Parent โดยที่ GrandParentID =
(เลือก ID ที่แตกต่างจาก GrandParent โดยที่ Name = 'John Smith')
พิมพ์ 'ลบพาเรนต์เรียบร้อยแล้ว'
สิ้นสุดการลอง
เริ่มจับ
พิมพ์ 'ข้อผิดพลาดในการลบผู้ปกครอง'
เริ่มลอง
ลบออกจากลูกโดยที่ ParentId =
(เลือก ID ที่แตกต่างจาก Parent โดยที่ GrandParentID =
(เลือก ID ที่แตกต่างจาก GrandParent โดยที่ Name = 'John Smith'))
พิมพ์ 'ลบลูกสำเร็จ'
สิ้นสุดการลอง
เริ่มจับ
พิมพ์ 'ข้อผิดพลาดในการลบเด็ก'
สิ้นสุดการจับ
สิ้นสุดการจับ
สิ้นสุดการจับ
นอกจากนี้ SQL SERVER 2005 ยังมีวิธีการคลาสข้อผิดพลาดในกลไกข้อยกเว้นเพื่ออำนวยความสะดวกในการดีบัก ซึ่งตัดตอนมาดังนี้ ซึ่งค่อนข้างง่ายและจะไม่มีการอธิบาย ส่งกลับระดับความรุนแรงของข้อผิดพลาด ERROR_STATE(): ส่งกลับหมายเลขสถานะข้อผิดพลาดที่เกี่ยวข้องกับข้อผิดพลาด ERROR_PROCEDURE(): ส่งกลับชื่อของขั้นตอนที่เก็บไว้หรือทริกเกอร์ที่เกิดข้อผิดพลาด ERROR_LINE(): ส่งกลับหมายเลขบรรทัดภายใน รูทีนที่ล้มเหลวที่ทำให้เกิดข้อผิดพลาด ERROR_MESSAGE(): ส่งกลับข้อความที่สมบูรณ์ของข้อความแสดงข้อผิดพลาดรวมถึงค่าที่ระบุสำหรับพารามิเตอร์ทดแทนใด ๆ เช่นความยาวชื่อวัตถุหรือเวลาตัวอย่างสุดท้ายมีดังนี้ โดยใช้วิธีคลาสข้อผิดพลาด BEGIN TRY
ประกาศ @X INT
-- หารด้วยศูนย์เพื่อสร้างข้อผิดพลาด
SET @X = 1/0
พิมพ์ 'คำสั่งหลังจากเกิดข้อผิดพลาดในบล็อก TRY'
สิ้นสุดการลอง
เริ่มจับ
พิมพ์ 'ตรวจพบข้อผิดพลาด'
เลือก ERROR_NUMBER() ERหมายเลข
ERROR_SEVERITY() ข้อผิดพลาด_ความรุนแรง
ERROR_STATE() ข้อผิดพลาด_สถานะ
ERROR_PROCEDURE() ข้อผิดพลาด_ขั้นตอน
ERROR_LINE() ข้อผิดพลาด_บรรทัด,
ERROR_MESSAGE() ข้อผิดพลาด_ข้อความ
จบการจับ
พิมพ์ 'คำสั่งหลังจากบล็อก TRY / CATCH'
ตรวจพบข้อผิดพลาดเอาต์พุตในที่สุด
Err_Num Err_Sev Err_State Err_Proc Err_Line Err_Msg
------- ------- --------- -------------------- ------- ----------------------------------
8134 16 1 NULL 4 พบข้อผิดพลาดหารด้วย
ศูนย์ ที่มา: jackyrong BLOG