خطایابی در Sql Server و آشنایی با بلوک Try…Catch

3257

مدیریت خطا

برخی از خطاها در طول چرخه ی حیات پایگاه داده رخ می دهد. این مشکل را نمی توان برطرف ساخت، در عوض می توان مشکلات یا خطاهای احتمالی را پیشبینی کرده و اقدام لازم را انجام داد.Microsoft SQL Server برای این منظور ابزار و مکانیزم های ویژه ای را ارائه می دهد.

انواع خطا: خطای مربوط به syntax

خطاهایی که با آن مواجه می شویم در گروه های مختلف قرار می گیرند. خطای مربوط به syntax زمانی رخ می دهد که ساختار نگارشی مورد استفاده ی توسعه دهنده در T-SQL پشتیبانی نمی شود و به عبارتی دیگر دستور نحوی صحیح و تنظیم شده توسط SQL بکار گرفته نمی شود.

انواع خطا: خطاهای زمان اجرا

زمانی که برنامه ی نوشته شده تلاش می کند عملیاتی را انجام دهد که یا Microsoft SQL Server و یا سیستم عامل اجازه ی اجرای آن را نمی دهد، یک خطا صادر می گردد که از آن به عنوان خطای زمان اجرا یا run-time یاد می شود. این خطاها ممکن است به خاطر پیچدگی و واضح نبودن به راحتی قابل برطرف کردن نباشند. در نتیجه ممکن است خطا یافت نشده و اصلا برطرف نشود. همچنین ممکن است خطا به پایگاه داده ارتباطی نداشته باشد.
ممکن است خطا در زمان تست پایگاه داده در Microsoft SQL Server خود را نشان نداده (برنامه به درستی در محیط کار کند)، اما زمانی که برنامه را توزیع کرده و نصب می کنید با مشکل مواجه شوید.

چگونگی اداره ی خطا: بلوک دستور  END TRY ... BEGIN TRY

مدیریت خطا عبارت است از توانایی و قابلیت برخورد با مشکلات نرم افزاری یا خطاهایی که ممکن است در پایگاه داده رخ دهد. خطا در اصطلاح برنامه نویسی استثنا یا EXECPTION خوانده می شود. برای کمک در مدیریت خطا یا استثنا، T-SQL دستور ویژه ای را تدارک دیده است. این قطعه کد را با عبارت کلیدی BEGIN TRY آغاز کرده و سپس کد مورد نظر را درج می کنیم و در پایان با عبارت END TRY خاتمه می دهیم:

BEGIN TRY
    Normal code
END TRY

بلوک دستور BEGIN CATCH … END CATCH

پس از بلوک TRY، بایستی بخشی را در کد ایجاد کنید که با عبارت کلیدی BEGIN CATCH شروع شده و با عبارت END CATCH پایان می یابد:
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() را فراخوانی کرد. دستور نگارشی آن به شرح زیر می باشد:

ERROR_NUMBER() RETURNS int;

تابع یاد شده هیچ آرگومانی نمی گیرد و به عنوان خروجی یک عدد صحیح برمی گرداند

پیام خطا (تابع ERROR_MESSAGE())

شماره ی خطا صرفا یک عدد است که در کد تابع ساخته شده و برای موتور DB قابل فهم و شناسایی می باشد. عدد ذکر شده هیچ اطلاعات دقیقی درباره ی آن خطا به شما نمی دهد. برای بازیابی یک نوشته که اطلاعاتی درباره ی خطا در اختیار توسعه دهنده قرار دهد، بایستی تابع ERROR_MESSAGE() را فراخوانی کرد. چگونگی نگارش و استفاده از آن در زیر نمایش داده شده است:

ERROR_MESSAGE() RETURNS nvarchar;

تابع ERROR_SEVERITY()

خطاها از لحاظ اهمیت و ضرورت برخورد با آن ها درجه های مختلفی دارند. برخی از خطاها باید بی درنگ برطرف شوند در حالی که برخی دیگر را می توان در زمان مناسب برطرف کرد. برای سنجش میزان اهمیت و شدت خطا، زبان T-SQL تابع ERROR_SEVERITY() را ارائه می کند.نحوه ی استفاده از آن به صورت زیر می باشد:

ERROR_SEVERITY() RETURNS int;

تابع ERROR_STATE()

موقعیت یا state یک خطا در واقع عددی است که بخش یا محل رخداد خطا در کد را نشان می دهد. علت نیاز به آن، امکان رخداد یا ایجاد خطا متفاوت توسط کد یکسان در بخش های مختلفی از کد مورد نظر می باشد. برای سهولت در شناسایی بخشی از کد که خطا در آن رخ داده، T-SQL تابع ERROR_STATE() را تعبیه کرده است. نحوه ی نگارش و استفاده از آن در زیر به نمایش گذاشته شده:

ERROR_STATE() RETURNS int;

 

این تابع هیچ آرگومانی نمی گیرد و به عنوان خروجی یک عدد صحیح برمی گرداند که نشانگر موقعیت یا جایگاهی از کد است که خطا در آن رخ داده است.

تولید خطا (raise exception)

در صورت رخداد خطا در کد می توانید به همان طریق که تاکنون به شما آموختیم، آن ها را مدیریت نمایید. اما برای تنظیم بهتر نحوه ی مدیریت خطا، می توان خود یک خطا تولید کرد. برای پشتیبانی از این امکان، T-SQL تابع RAISERROR() را ارائه می دهد. روش استفاده از آن به صورت زیر می باشد:

RAISERROR ( { msg_id | msg_str | @local_variable }
    { ,severity ,state }
    [ ,argument [ ,...n ] ] )
    [ WITH option [ ,...n ] ]

این تابع سه آرگومان الزامی می پذیرد:
1. اولین آرگومان ارسالی به آن می تواند یکی از سه مورد ذکر شده در زیر باشد:

  • آرگومان می توان یک عدد صحیح ثابت باشد. برای شروع، یک پیام ایجاد می کنیم، به آن عددی بزرگتر از 50000 تخصیص می دهیم و سپس پیام را با ذخیره ی آن در کتابخانه ی sys.messages به T-SQL ارسال می کنیم. پس از این کار، جهت دسترسی به پیام یاد شده، کافی است عددی که برای آن در نظر گرفتیم را ذکر نماییم.
  • آرگومان می تواند یک شی msg_str باشد. در این صورت، آرگومان آن پیامی است که می خواهید در صورت اتفاق افتادن خطا، نمایش داده شود.
  • آرگومان می تواند یک متغیر رشته ای محلی باشد. سپس به صورت آرگومان قبلی مقداردهی اولیه و فرمت دهی می شود.

2. آرگومان دوم یک عدد می باشد که بیانگر میزان یا سطح شدت خطا است. می توان این عدد را مطابق میل خود انتخاب کنید. عددی که برای این آرگومان انتخاب می کنید باید بین 0 تا 18 باشد. در صورتی که عضوی از گروه sysadmin می باشید، در آن صورت می توانید عدد بزرگتری را انتخاب کنید. در صورتی که عدد انتخابی بزرگتر بین 20 تا 25 باشد، این بیانگر خطایی با شدت بسیار بالا در نظر گرفته می شود که ممکن است منجر به قطع اتصال به پایگاه داده شود.
3. آرگومان سوم یک عدد است که نشانگر جایگاه یا محل رخداد خطا در کد می باشد. برای این آرگومان می توان هر عددی بین 1 تا 127 مشخص کرد. در صورتی که چندین بخش ویژه ی استثنا در کد ایجاد می کنید، بایستی به ازای هر یک، شماره ی موقعیت (state number) منحصر بفرد درنظر بگیرید.

 

پاس دادن خطاها (کلیدواژه ی throw)

قبلا با نحوه ی یافتن و تشخیص نوع خطا در کد و همچنین انجام اقدامات لازم آشنا شدیم. اکنون سعی داریم موتور 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 تایپ کنید.




از مجموع 22 رأی

فاقد نظر