برخی از خطاها در طول چرخه ی حیات پایگاه داده رخ می دهد. این مشکل را نمی توان برطرف ساخت، در عوض می توان مشکلات یا خطاهای احتمالی را پیشبینی کرده و اقدام لازم را انجام داد.Microsoft SQL Server برای این منظور ابزار و مکانیزم های ویژه ای را ارائه می دهد.
خطاهایی که با آن مواجه می شویم در گروه های مختلف قرار می گیرند. خطای مربوط به syntax زمانی رخ می دهد که ساختار نگارشی مورد استفاده ی توسعه دهنده در T-SQL پشتیبانی نمی شود و به عبارتی دیگر دستور نحوی صحیح و تنظیم شده توسط SQL بکار گرفته نمی شود.
زمانی که برنامه ی نوشته شده تلاش می کند عملیاتی را انجام دهد که یا Microsoft SQL Server و یا سیستم عامل اجازه ی اجرای آن را نمی دهد، یک خطا صادر می گردد که از آن به عنوان خطای زمان اجرا یا run-time یاد می شود. این خطاها ممکن است به خاطر پیچدگی و واضح نبودن به راحتی قابل برطرف کردن نباشند. در نتیجه ممکن است خطا یافت نشده و اصلا برطرف نشود. همچنین ممکن است خطا به پایگاه داده ارتباطی نداشته باشد.
ممکن است خطا در زمان تست پایگاه داده در Microsoft SQL Server خود را نشان نداده (برنامه به درستی در محیط کار کند)، اما زمانی که برنامه را توزیع کرده و نصب می کنید با مشکل مواجه شوید.
BEGIN
TRY
Normal code
END
TRY
BEGIN
TRY
Normal code
END
TRY
BEGIN
CATCH
END
CATCH
بخشی که از BEGIN CATCH شروع شده تا END CATCH ادامه دارد در اصطلاح ساختمان یا بلوک CATCH خوانده می شود. اصولی که باید رعایت کنید، به شرح زیر می باشد:
1. در صورت ایجاد یک بلوک try باید یک بلوک catch نیز ایجاد نمایید.
2. بین دو عبارت کلیدی END TRY و BEGIN CATCH تحت هیچ شرایطی نباید از دستور T-SQL استفاده کرد (بین این دو بخش فقط می توان COMMENT درج نمود).
چنانچه هیچ خطایی در بلوک TRY رخ ندارد، در آن صورت می توان بلوک CATCH را تهی بگذارید.
برای کمک رسانی در شناسایی و یافتن خطا، T-SQL توابع متعددی را ارائه می کند. زمانی که خطا در کد رخ می دهد، احتمالا آنچه پیش از هر چیز ذهن شما را به خود مشغول می کند، یافتن محل رخداد خطا است. برای این منظور زبان T-SQL تابعی به نام ERROR_LINE() را تعبیه کرده است. نحوه ی کلی استفاده از آن به صورت زیر می باشد:
ERROR_LINE() RETURNS int;
تابع نام برده در بالا، هیچ آرگومان یا پارامتر ورودی نمی گیرد. این تابع همچنین در خروجی، یک عدد برمی گرداند که نشانگر آن خط از کد می باشد که خطا در آن رخ داده است. با استفاده از یک دستور شرطی، می توانید به موتور DB دستور دهید خط کد حاوی خطا را شناسایی و پیدا کند. با اطلاعات ارائه شده می توان عملیات لازم را انجام داد.
هر نوع خطا با یک شماره ی خاص شناسایی می شود. برای بازیابی شماره ی خطا (که بیانگر نوع خطا می باشد)، می توان تابع ERROR_NUMBER() را فراخوانی کرد. دستور نگارشی آن به شرح زیر می باشد:
ERROR_NUMBER() RETURNS int;
تابع یاد شده هیچ آرگومانی نمی گیرد و به عنوان خروجی یک عدد صحیح برمی گرداند
شماره ی خطا صرفا یک عدد است که در کد تابع ساخته شده و برای موتور DB قابل فهم و شناسایی می باشد. عدد ذکر شده هیچ اطلاعات دقیقی درباره ی آن خطا به شما نمی دهد. برای بازیابی یک نوشته که اطلاعاتی درباره ی خطا در اختیار توسعه دهنده قرار دهد، بایستی تابع ERROR_MESSAGE() را فراخوانی کرد. چگونگی نگارش و استفاده از آن در زیر نمایش داده شده است:
ERROR_MESSAGE() RETURNS nvarchar;
خطاها از لحاظ اهمیت و ضرورت برخورد با آن ها درجه های مختلفی دارند. برخی از خطاها باید بی درنگ برطرف شوند در حالی که برخی دیگر را می توان در زمان مناسب برطرف کرد. برای سنجش میزان اهمیت و شدت خطا، زبان T-SQL تابع ERROR_SEVERITY() را ارائه می کند.نحوه ی استفاده از آن به صورت زیر می باشد:
ERROR_SEVERITY() RETURNS int;
موقعیت یا state یک خطا در واقع عددی است که بخش یا محل رخداد خطا در کد را نشان می دهد. علت نیاز به آن، امکان رخداد یا ایجاد خطا متفاوت توسط کد یکسان در بخش های مختلفی از کد مورد نظر می باشد. برای سهولت در شناسایی بخشی از کد که خطا در آن رخ داده، T-SQL تابع ERROR_STATE() را تعبیه کرده است. نحوه ی نگارش و استفاده از آن در زیر به نمایش گذاشته شده:
ERROR_STATE() RETURNS int;
این تابع هیچ آرگومانی نمی گیرد و به عنوان خروجی یک عدد صحیح برمی گرداند که نشانگر موقعیت یا جایگاهی از کد است که خطا در آن رخ داده است.
در صورت رخداد خطا در کد می توانید به همان طریق که تاکنون به شما آموختیم، آن ها را مدیریت نمایید. اما برای تنظیم بهتر نحوه ی مدیریت خطا، می توان خود یک خطا تولید کرد. برای پشتیبانی از این امکان، T-SQL تابع RAISERROR() را ارائه می دهد. روش استفاده از آن به صورت زیر می باشد:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
این تابع سه آرگومان الزامی می پذیرد:
1. اولین آرگومان ارسالی به آن می تواند یکی از سه مورد ذکر شده در زیر باشد:
2. آرگومان دوم یک عدد می باشد که بیانگر میزان یا سطح شدت خطا است. می توان این عدد را مطابق میل خود انتخاب کنید. عددی که برای این آرگومان انتخاب می کنید باید بین 0 تا 18 باشد. در صورتی که عضوی از گروه sysadmin می باشید، در آن صورت می توانید عدد بزرگتری را انتخاب کنید. در صورتی که عدد انتخابی بزرگتر بین 20 تا 25 باشد، این بیانگر خطایی با شدت بسیار بالا در نظر گرفته می شود که ممکن است منجر به قطع اتصال به پایگاه داده شود.
3. آرگومان سوم یک عدد است که نشانگر جایگاه یا محل رخداد خطا در کد می باشد. برای این آرگومان می توان هر عددی بین 1 تا 127 مشخص کرد. در صورتی که چندین بخش ویژه ی استثنا در کد ایجاد می کنید، بایستی به ازای هر یک، شماره ی موقعیت (state number) منحصر بفرد درنظر بگیرید.
قبلا با نحوه ی یافتن و تشخیص نوع خطا در کد و همچنین انجام اقدامات لازم آشنا شدیم. اکنون سعی داریم موتور DB را در خصوص عملیاتی که در صورت/زمان رخداد خطا باید انجام دهد، راهنمایی کنیم. می دانیم چگونه خطا را به وسیله ی عدد مشخص شده برای آن شناسایی کنیم. به عنوان یک جایگزین می توان شماره ی خطای اختصاصی خود را همراه با پیام های مربوطه مشخص کرد (خود یک شماره برای خطای مشخص انتخاب کرد و پیام دلخواه را برای نمایش در صورت رخداد آن خطا تنظیم نمود). برای این منظور کافی است مکانیزمی به نام پرتاب یا تولید خطای اختصاصی (throw exception) را بکار ببرید.
با استفاده از throw همراه با بلوک دستور try و catch استفاده کنید، می توانید گردش برنامه را کنترل کرده و پیام های خطای اختصاصی خود را ایجاد نمایید.
برای پرتاب یک خطا، باید ابتدا کلیدواژه ی THROW را بکار ببرید. فرمولی که می بایست برای نگارش دستور بکار ببرید، به صورت زیر می باشد:
1
2
3
4
|
THROW [ { error_number | @local_variable }, { message | @local_variable }, { state | @local_variable } ] [ ; ] |
برای تولید و ارسال خطای اختصاصی خود، همان طور که ذکر شد لازم است یک دستور THROW در ساختمان CATCH بکار ببرید. پس از کلیدواژه ی THROW، یک عدد بزرگتر از 50000، کاراکتر ویرگول و به دنبال آن رشته ی متنی حاوی پیام خطا را وارد نموده و در پایان یک عدد طبیعی بین 0 تا 255 تایپ کنید.