ใช้การจัดการข้อยกเว้นที่มีโครงสร้าง

เสร็จสมบูรณ์เมื่อ

หลังจากที่คุณทําความเข้าใจเกี่ยวกับลักษณะของข้อผิดพลาดและการจัดการข้อผิดพลาดพื้นฐานใน 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