ใช้การจัดการข้อยกเว้นที่มีโครงสร้าง
หลังจากที่คุณทําความเข้าใจเกี่ยวกับลักษณะของข้อผิดพลาดและการจัดการข้อผิดพลาดพื้นฐานใน T-SQL แล้ว ถึงเวลาดูรูปแบบการจัดการข้อผิดพลาดที่ขั้นสูงขึ้นแล้ว มีการนําการจัดการข้อยกเว้นที่มีโครงสร้างมาใช้ใน SQL Server 2005
ที่นี่คุณจะเห็นวิธีใช้และประเมินประโยชน์และข้อจํากัดรวมถึงบล็อก TRY CATCH บทบาทของฟังก์ชันการจัดการข้อผิดพลาดและทําความเข้าใจความแตกต่างระหว่างข้อผิดพลาดที่สามารถจับได้และไม่สามารถแยกแยะได้ ในตอนท้าย คุณจะเห็นว่าข้อผิดพลาดสามารถจัดการและทําให้พื้นผิวเมื่อจําเป็นได้อย่างไร
การเขียนโปรแกรมบล็อก TRY/CATCH คืออะไร
การจัดการข้อยกเว้นที่มีโครงสร้างมีประสิทธิภาพมากกว่าการจัดการข้อผิดพลาดตามตัวแปรระบบ@@ERROR ซึ่งช่วยให้คุณสามารถป้องกันไม่ให้รหัสถูกทิ้งกระจัดกระจายด้วยรหัสการจัดการข้อผิดพลาดและรวมศูนย์รหัสการจัดการข้อผิดพลาดนั้น การรวมศูนย์ของโค้ดการจัดการข้อผิดพลาดยังหมายความว่าคุณสามารถมุ่งเน้นไปที่วัตถุประสงค์ของโค้ดมากกว่าการจัดการข้อผิดพลาดที่มี
ลองบล็อกและบล็อก CATCH
เมื่อใช้การจัดการข้อยกเว้นที่มีโครงสร้าง โค้ดที่อาจทําให้เกิดข้อผิดพลาดจะถูกวางไว้ภายในบล็อก TRY บล็อก TRY จะล้อมรอบด้วยคําสั่ง BEGIN TRY และ END TRY
หากเกิดข้อผิดพลาดที่สามารถจับได้ - ข้อผิดพลาดส่วนใหญ่อาจถูกจับได้ ตัวควบคุมการดําเนินการย้ายไปยังบล็อก CATCH บล็อก CATCH คือชุดของคําสั่ง T-SQL ที่ล้อมรอบด้วยคําสั่ง BEGIN CATCH และ END CATCH
หมายเหตุ
ในขณะที่ START CATCH และ END TRY เป็นคําสั่งแยกต่างหาก คําสั่ง BEGIN CATCH ต้องเป็นไปตาม END TRY ทันที
ข้อจํากัดปัจจุบัน
ภาษาระดับสูงมักจะนําเสนอการสร้างแบบลอง/จับ/สุดท้าย และมักใช้เพื่อเผยแพร่ทรัพยากรโดยนัย ไม่มีบล็อก FINALLY ที่เทียบเท่าใน T-SQL
ทําความเข้าใจความแตกต่างระหว่างข้อผิดพลาดที่จับได้และไม่สามารถเทียบได้
สิ่งสําคัญคือต้องตระหนักว่าในขณะที่บล็อก TRY/CATCH ช่วยให้คุณสามารถตรวจจับข้อผิดพลาดที่หลากหลายกว่าที่คุณสามารถทําได้ด้วย@@ERROR คุณไม่สามารถจับได้ทุกประเภท
ข้อผิดพลาดที่จับได้เทียบกับข้อผิดพลาดที่ไม่สอดคล้องกัน
ไม่สามารถจับข้อผิดพลาดทั้งหมดได้โดยบล็อก TRY/CATCH ภายในขอบเขตเดียวกันที่มีบล็อก TRY/CATCH อยู่ บ่อยครั้งที่ข้อผิดพลาดที่ไม่สามารถจับได้ในขอบเขตเดียวกันสามารถถูกจับได้ในขอบเขตโดยรอบ ตัวอย่างเช่น คุณอาจไม่สามารถตรวจจับข้อผิดพลาดภายในกระบวนงานที่เก็บไว้ที่มีบล็อก TRY/CATCH ได้ อย่างไรก็ตาม คุณอาจตรวจจับข้อผิดพลาดนั้นในบล็อก TRY/CATCH ในโค้ดที่เรียกว่า Stored Procedure ที่มีข้อผิดพลาดเกิดขึ้น
ข้อผิดพลาดทั่วไปที่ไม่ตรงกัน
ตัวอย่างทั่วไปของข้อผิดพลาดที่ไม่สามารถเทียบได้คือ:
- คอมไพล์ข้อผิดพลาด เช่น ข้อผิดพลาดทางไวยากรณ์ ที่ป้องกันไม่ให้ชุดงานคอมไพล์
- ปัญหาการคอมไพล์ระดับคําสั่งที่มักจะเกี่ยวข้องกับการแก้ชื่อรอการตัดบัญชี ตัวอย่างเช่น คุณสามารถสร้าง Stored Procedure ที่อ้างอิงถึงตารางที่ไม่รู้จัก ข้อผิดพลาดจะแสดงขึ้นมาเมื่อขั้นตอนพยายามแก้ไขชื่อของตารางเป็น objectid เท่านั้น
วิธีเปลี่ยนชื่อข้อผิดพลาดโดยใช้ THROW
ถ้ามีการใช้คําสั่ง THROW ในบล็อก CATCH โดยไม่มีพารามิเตอร์ใดก็ตาม ระบบจะเลี่ยงข้อผิดพลาดที่ทําให้รหัสเข้าสู่บล็อก CATCH อีกครั้ง คุณสามารถใช้เทคนิคนี้เพื่อใช้การเข้าสู่ระบบข้อผิดพลาดในฐานข้อมูลโดยจับข้อผิดพลาดและบันทึกรายละเอียดของพวกเขาแล้วโยนข้อผิดพลาดเดิมไปยังแอปพลิเคชันไคลเอ็นต์เพื่อให้สามารถจัดการได้
นี่คือตัวอย่างของวิธีการเปลี่ยนชื่อข้อผิดพลาด
BEGIN TRY
-- code to be executed
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
THROW
END CATCH
ใน SQL Server รุ่นก่อนหน้าบางรุ่น ไม่มีเมธอดในการแสดงข้อผิดพลาดของระบบ ในขณะที่โยนไม่สามารถระบุข้อผิดพลาดของระบบให้เกิดขึ้นได้ เมื่อใช้โยนโดยไม่มีพารามิเตอร์ในบล็อก CATCH จะเรียกคืนทั้งข้อผิดพลาดของระบบและผู้ใช้
ฟังก์ชันการจัดการข้อผิดพลาดคืออะไร
บล็อก CATCH ทําให้ข้อมูลที่เกี่ยวข้องกับข้อผิดพลาดพร้อมใช้งานตลอดระยะเวลาของบล็อก CATCH ซึ่งรวมถึงขอบเขตย่อย เช่น กระบวนงานที่เก็บไว้ ซึ่งเรียกใช้จากภายในบล็อก CATCH
ฟังก์ชันการจัดการข้อผิดพลาด
คุณควรจําว่า เมื่อเขียนโปรแกรมด้วย@@ERROR ค่าที่@@ERROR ตัวแปรระบบถูกรีเซ็ตทันทีที่ดําเนินการคําสั่งถัดไป
ประโยชน์สําคัญอีกประการหนึ่งของการจัดการข้อยกเว้นที่มีโครงสร้างใน T-SQL คือมีการกําหนดชุดฟังก์ชันการจัดการข้อผิดพลาดและทําให้ค่าเหล่านี้ตลอดบล็อก CATCH ฟังก์ชันที่แยกต่างหากมีคุณสมบัติของข้อผิดพลาดที่เกิดขึ้นแต่ละรายการ
ซึ่งหมายความว่าคุณสามารถเขียนข้อผิดพลาดทั่วไปในการจัดการกระบวนงานที่เก็บไว้ซึ่งยังคงสามารถเข้าถึงข้อมูลที่เกี่ยวกับข้อผิดพลาดได้
- บล็อก CATCH ทําให้ข้อมูลที่เกี่ยวข้องกับข้อผิดพลาดพร้อมใช้งานตลอดระยะเวลาของบล็อก CATCH
- @@Error จะถูกรีเซ็ตเมื่อมีการเรียกใช้คําสั่งถัดไป
จัดการข้อผิดพลาดในโค้ด
การรวม SQL CLR อนุญาตให้มีการดําเนินการของโค้ดที่มีการจัดการภายใน SQL Server ภาษา .NET ระดับสูง เช่น C# และ VB มีการจัดการข้อยกเว้นโดยละเอียดที่พร้อมใช้งาน สามารถจับข้อผิดพลาดได้โดยใช้มาตรฐาน .NET try/catch/blocks ในที่สุด
ข้อผิดพลาดในโค้ดที่มีการจัดการ
โดยทั่วไป คุณอาจต้องการตรวจจับข้อผิดพลาดภายในโค้ดที่มีการจัดการมากที่สุดเท่าที่เป็นไปได้ สิ่งสําคัญคือต้องตระหนักว่าข้อผิดพลาดใด ๆ ที่ไม่ได้จัดการในโค้ดที่มีการจัดการจะถูกส่งผ่านกลับไปยังรหัส T-SQL ที่เรียก เมื่อใดก็ตามที่ข้อผิดพลาดใด ๆ ที่เกิดขึ้นในโค้ดที่มีการจัดการถูกส่งกลับไปยัง SQL Server ข้อผิดพลาดดังกล่าวจะปรากฏเป็นข้อผิดพลาด 6522 ข้อผิดพลาดสามารถซ้อนกันได้ และข้อผิดพลาดนั้นจะตัดสาเหตุที่แท้จริงของข้อผิดพลาด
สาเหตุที่พบได้ยากแต่อาจเกิดขึ้นได้อีกอย่างหนึ่งของข้อผิดพลาดในโค้ดที่มีการจัดการคือ โค้ดสามารถดําเนินการคําสั่ง RAISERROR T-SQL ผ่านวัตถุ SqlCommand