יישום טיפול בחריגים מובנים
כעת, לאחר שאתה מבין את אופי השגיאות וטיפול בסיסי בשגיאות ב- T-SQL, הגיע הזמן בחן צורה מתקדמת יותר של טיפול בשגיאות. טיפול בחריגים מובנים הוצג ב- SQL Server 2005.
כאן, תוכל לראות כיצד להשתמש בו ולהעריך את היתרונות והמגבלות שלו, כולל הבלוק TRY CATCH, התפקיד של פונקציות טיפול בשגיאות והבנת ההבדל בין שגיאות הניתנות לקליטה שאינה ניתנת לבחירה. לבסוף, תוכל לראות כיצד ניתן לנהל שגיאות ול surfaced בעת הצורך.
מהו תיכנות בלוק TRY/CATCH
טיפול בחריגים מובנים חזק יותר מטיפול בשגיאות בהתבסס על @@ERROR המערכת. היא מאפשרת לך למנוע התזת קוד עם קוד טיפול בשגיאות ולרכז את הקוד לטיפול בשגיאות. הרכזות של קוד טיפול בשגיאות גם מאפשרת לך להתמקד יותר למטרת הקוד במקום בטיפול בשגיאות שהוא מכיל.
נסה חסימה ובלוק CATCH
בעת שימוש בטיפול חריגים מובנים, קוד שעשוי להעלות שגיאה ממוקם בתוך בלוק TRY. בלוקים של TRY מוקפים במשפטי BEGIN TRYו- END TRY .
אם תתרחש שגיאה הניתנת לקליטה - רוב השגיאות עלולות להיתפס, פקד הביצוע עובר לבלוק CATCH. בלוק CATCH הוא סידרה של משפטי T-SQL המוקפים במשפטי BEGIN CATCHו- END CATCH .
הערה
בזמן שה- BEGIN CATCH ו- END TRY הם משפטים נפרדים, על ה- BEGIN CATCH לפעול באופן מיידי בהתאם ל- END TRY.
מגבלות נוכחיות
שפות ברמה גבוהה מציעות לעתים קרובות ניסיון/קליט/סוף בנייתן, ומשמשות לעתים קרובות להפצה משתמעת של משאבים. אין חסימה שוות ערך של FINALLY ב- T-SQL.
הבנת ההבדל בין שגיאות הניתנות לקליטת שגיאות שאינן ניתנות לבחירה
חשוב להבין ש, בעוד שבלוקים של TRY/CATCH מאפשרים לך ללכוד מגוון רחב הרבה יותר של שגיאות מאשר עם @@ERROR, לא תוכל לתפוס כל סוג.
שגיאות הניתנות לקליטה לעומת שגיאות שאינן ניתנות לבחירה
לא כל השגיאות יכולות להתפס על-ידי בלוקים של TRY/CATCH באותו טווח שבו קיים בלוק TRY/CATCH. לעתים קרובות, שגיאות שלא ניתן להיתפס באותו טווח אינן נתפסות בטווח המקיף. לדוגמה, ייתכן שלא תוכל ללכוד שגיאה בתוך הפרוצדורה המאוחסנת המכילה את הבלוק TRY/CATCH. עם זאת, ייתכן שתקליט שגיאה זו בבלוק TRY/CATCH בקוד שקרא לפרוצדורה המאוחסנת שבה אירעה השגיאה.
שגיאות נפוצות שאינן ניתנות להתאמה
להלן דוגמאות נפוצות לשגיאות שאינן ניתנות להתאמה:
- הידור שגיאות, כגון שגיאות תחביר, שמונעות הידור של אצווה.
- בעיות compilation ברמת המשפט הקשורות בדרך כלל לרזולוציית שם דחוי. לדוגמה, באפשרותך ליצור פרוצדורה מאוחסנת המפנה לטבלה לא ידועה. מתרחשת שגיאה רק כאשר הפרוצדורה מנסה לזהות את שם הטבלה ל - objectid.
כיצד להעביר מחדש שגיאות באמצעות THROW
אם נעשה שימוש במשפט THROW בבלוק CATCH ללא פרמטרים כלשהם, הוא יתחיל מחדש את השגיאה שגרמה לקוד להזין את בלוק ה- CATCH. באפשרותך להשתמש בשיטה זו כדי ליישם רישום שגיאות במסד הנתונים על-ידי תפיסת שגיאות ורישום הפרטים שלהם, ולאחר מכן התראת השגיאה המקורית ליישום הלקוח, כדי שניתן יהיה לטפל בו שם.
להלן דוגמה לאופן שבו ניתן לבצע מחדש שגיאה.
BEGIN TRY
-- code to be executed
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
THROW
END CATCH
בגירסאות קודמות מסוימות של SQL Server, לא היתה שיטה לשגיאה במערכת. בעוד ש- THROW אינו יכול לציין שגיאת מערכת לצורך העלאה, כאשר הפונקציה THROW נמצאת בשימוש ללא פרמטרים בבלוק CATCH, היא תחזר הן את שגיאות המערכת והן את שגיאות המשתמש.
מהן פונקציות לטיפול בשגיאות
בלוקי CATCH הפיכת המידע הקשור לשגיאות לזמין לאורך כל משך הבלוק CATCH. הדבר כולל טווחי משנה, כגון פרוצדורות מאוחסנות, אשר פועלים מתוך בלוק CATCH.
פונקציות טיפול בשגיאות
עליך לזכור כי בעת תיכנות עם @@ERROR, הערך המוחזק על-ידי @@ERROR המערכת אופס ברגע שהצהרה הבאה בוצעה.
יתרון מרכזי נוסף של טיפול בחריגים מובנים ב- T-SQL הוא שסידרה של פונקציות לטיפול בשגיאות הופקה וערכים אלה שומרים את הערכים שלהם בבלוק CATCH. פונקציות נפרדות מספקות כל מאפיין של שגיאה שהועלתה.
משמעות הדבר היא שבאפשרותך לכתוב פרוצדורות מאוחסנות לטיפול בשגיאות כלליות, שעדיין יכולות לגשת למידע הקשור לשגיאות.
- בלוקי CATCH הפיכת המידע הקשור לשגיאות לזמין לאורך כל משך הבלוק CATCH.
- @@Error יאופס בעת הפעלת המשפט הבא.
ניהול שגיאות בקוד
שילוב SQL CLR מאפשר ביצוע של קוד מנוהל בתוך SQL Server. שפות .NET ברמה גבוהה, כגון C# ו- VB, כוללות טיפול מפורט בחריגים הזמין עבורן. ניתן להיתפס בשגיאות באמצעות .NET try/catch/finally blocks רגיל.
שגיאות בקוד מנוהל
באופן כללי, ייתכן שתרצה ללכוד שגיאות בתוך קוד מנוהל ככל האפשר. עם זאת, חשוב להבין שכל השגיאות שלא טופלו בקוד המנוהל מועברות בחזרה לקוד ה- T-SQL של השיחות. בכל פעם ששגיאה שמתרחשת בקוד מנוהל מוחזרת ל- SQL Server, היא תופיע כשגיאה 6522. שגיאות יכולות להיות מקוננות ושגיאה מסוימת זו תעטוף את הגורם האמיתי לשגיאה.
סיבה נדירה נוספת לשגיאות בקוד מנוהל עשויה להיות שהקוד יכול לבצע משפט RAISERROR T-SQL באמצעות אובייקט SqlCommand.