آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

مدیریت خطا در Sql

دوره های مرتبط با این مقاله

مدیریت خطا

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


آموزش کاربردی

  1. محیط Microsoft SQL Server را راه اندازی کنید.
  2. در کادر محاوره ای اتصال به سرور، با کلیک بر روی لیست کشویی Authentication، گزینه ی Windows Authentication را انتخاب نمایید.
  3. در نوار ابزار اصلی محیط، بر روی دکمه ی New Query کلیک نمایید.

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

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


آموزش SQL

این خطا به خاطر عدم استفاده ی صحیح از عملگر SET رخ داده است.
2. چنانچه واژه ی کلیدی یا عملگری را درست تایپ نکنید، باز هم Code Editor آن را با خط قرمز رنگ در زیر آن به شما نمایش می دهد. نمونه:

آموزش SQL

3. اگر عملگر کاراکتر یا بخش الزامی از کد را فراموش کنید، در زمان اجرای کد با خطا مواجه می شوید. برطرف ساختن این دست از خطاها، از آنجایی که بلافاصله توسط Code Editor شناسایی شده و نمایش داده می شوند، به طور معمول آسان می باشد.
اگر از یک پنجره ی فرمان (برنامه ی مبتنی بر فرمان SQLCMD یا PowerShell) برای کدنویسی استفاده کنید، خطا بلافاصله و در زمان کدنویسی نمایش داده نمی شود، بلکه پس از اجرای کد نشان داده می شود.


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

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


  1. تلاش برای اجرای کدی که موجود نیست یا به درستی تعریف نشده است
  2. اجرای محاسبات غلط همچون تقسیم عددی بر 0.
آموزش SQL

همان طور که مشاهده می کنید، Code Editor هیچ خطایی را نمایش نمی دهد، زیرا که خطا مربوط به syntax نمی باشد.
3. تلاش برای استفاده و فراخوانی یک تابع، stored procedure یا trigger که تعریف نشده، وجود ندارد یا در دسترس نیست.
4. استفاده از حافظه ی کامپیوتر یا دسترسی به آن در حالی که به میزان کافی آزاد یا در دسترس نیست.
5. تلاش برای اجرای عملیاتی که یک متغیر یا شی قادر به اداره ی آن نیست. به عنوان مثال زمانی که سعی کنیم مقداری را در متغیر ذخیره کنیم که از محدوده ی تعریف شده برای آن بزرگتر است.


مثال:
آموزش SQL

در تصویر فوق مشاهده می کنید که Code Editor هیچ خطایی را نشان نمی دهد (زیرا خطا مربوط به syntax).
6. اجرای عملیات بر روی متغیرهای از نوع ناسازگار.
7. استفاده ی ناصحیح از یک دستور شرطی یا بکار بردن دستور شرطی که به صورت غلط نگارش و ساخته شده باشد. خطاهای زمان اجرا عموما به سختی قابل شناسایی و برطرف کردن می باشند.


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

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


BEGIN TRY
    Normal code
END TRY

بین خطوط BEGIN TRY و END TRY کد اجرایی را وارد می کنیم.


مثال:
BEGIN TRY
    DECLARE @Side decimal(6, 3),
	    @Perimeter decimal(6, 3);
	
    SET @Side = 124.36;
    SET @Perimeter = @Side * 4;
	
    SELECT @Side AS Side, @Perimeter AS Perimeter;
END TRY

این بخش از کد که از BEGIN TRY آغاز شده و تا END TRY ادامه دارد، در اصطلاح بلوک یا ساختمان 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 را تهی بگذارید.


مثال:
BEGIN TRY
    DECLARE @Side decimal(6, 3),
	    @Perimeter decimal(6, 3);
	
    SET @Side = 124.36;
    SET @Perimeter = @Side * 4;
	
    SELECT @Side AS Side, @Perimeter AS Perimeter;
END TRY
BEGIN CATCH
END CATCH

نتیجه ی زیر را بدست می دهد:
آموزش SQL
در زیر کدی را مشاهده می کنید که خطا می دهد:
DECLARE @Number tinyint,
       @Result tinyint;
	
SET @Number = 252;
SET @Result = @Number + 20;
	
SELECT @Number AS Number, @Result AS Result;
GO

نتیجه:
آموزش SQL

برای حل این نوع مشکل، می توانید با استفاده از قابلیت مدیریت خطا کد اجرایی را در یک بلوک TRY قرار دهید، سپس در صورت رخداد خطا در بلوک ذکر شده، از بلوک CATCH برای نمایش پیام (خطا) کمک بگیرید.


مثال:
BEGIN TRY
    DECLARE @Number tinyint,
	    @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 20;
	
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    PRINT N'There was a problem with the program';
END CATCH

از سوی دیگر، در صورتی که هیچ خطایی در بلوک TRY رخ ندهد، در آن صورت بلوک TRY اجرا می شود اما زمانی که خاتمه می یابد، اجرا بلوک CATCH را نادیده می گیرد و با کدی که در زیر خط END CATCH قرار دارد ادامه می یابد.
بنابراین، می توان خطاها را با استفاده از دستور try…catch اداره کرد. بدین صورت که کدی را که احتمال می دهید ایجاد خطا کند داخل ساختمان try قرار می دهید. بلوک catch کدهایی را دربرمی گیرد که در صورت مواجه شدن برنامه با خطا، اجرا می شوند. تعریف ساده ی این دو بلوک به این صورت است که بلوک try سعی می کند که دستورات را اجرا کند و اگر در بین دستورات خطایی وجود داشته باشد برنامه دستورات مربوط به بخش catch را اجرا می نماید.


آموزش کاربردی: ایجاد یک استثنا

1. کل دستورات موجود در editor را انتخاب کرده و کد زیر را در آن وارد نمایید:


BEGIN TRY
    DECLARE @Number tinyint,
	    @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 20;
	
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    PRINT N'There was a problem with the program';
END CATCH
GO

2. کلید F5 را زده تا مجموعه دستورات اجرا گردد.
نتیجه ی زیر حاصل می گردد:


آموزش SQL

شناسایی خطا

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


ERROR_LINE() RETURNS int;

تابع نام برده در بالا، هیچ آرگومان یا پارامتر ورودی نمی گیرد. این تابع همچنین در خروجی، یک عدد برمی گرداند که نشانگر آن خط از کد می باشد که خطا در آن رخ داده است. با استفاده از یک دستور شرطی، می توانید به موتور DB دستور دهید خط کد حاوی خطا را شناسایی و پیدا کند. با اطلاعات ارائه شده می توان عملیات لازم را انجام داد.


بازیابی شماره ی خط دربردارنده ی خطا

1. کد موجود در text editor را به صورت زیر ویرایش نمایید:


BEGIN TRY
    DECLARE @Number tinyint,
            @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 20;
	
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    PRINT N'Error Line: ' + CAST(ERROR_LINE() AS nvarchar(100));
END CATCH
GO

2. با زدن کلید F5 کد را اجرا کنید.
نتیجه ی زیر را برمی گرداند:


آموزش SQL

تابع ERROR_NUMBER()

هر نوع خطا با یک شماره ی خاص شناسایی می شود. برای بازیابی شماره ی خطا (که بیانگر نوع خطا می باشد)، می توان تابع ERROR_NUMBER() را فراخوانی کرد. دستور نگارشی آن به شرح زیر می باشد:


ERROR_NUMBER() RETURNS int;

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


مثال:
BEGIN TRY
    DECLARE @Number tinyint,
	    @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 20;
	
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    PRINT N'Error Number: ' + TRY_CAST(ERROR_NUMBER() AS NVARCHAR(50));
END CATCH

سپس با استفاده از شماره ی خطا اقدامات لازم را انجام می دهیم. در مثال زیر این عدد در بخش Messages به نمایش گذاشته شده است:


آموزش SQL

برای بدست آوردن شماره ی خطایی که خروجی کد می باشد، می توان درباره ی مقدار ارائه شده توسط تابع ERROR_NUMBER() پرس و جو انجام داد. برای این منظور، می توان از دستور شرطی IF کمک گرفت. پس از بدست آوردن شماره ی خطا، می تون اقدام لازم را انجام داد. به عنوان مثال، می توان یک پیام خطا نمایش داد مانند نمونه ی زیر:


آموزش SQL

می توان کارهای دیگری هم انجام داد.
در ویرایش های پیشین Microsoft SQL Server، جهت بدست آوردن شماره ی خطا می بایست تابعی به نام @@ERROR را فراخوانی می کردیم. این تابع همچنان قابل استفاده می باشد. نحوه ی استفاده ی از آن در زیر تشریح شده است:


@@ERROR() RETURNS int;

این تابع را می توان برای بازیابی شماره ی خطایی که نتیجه ی یک استثنا می باشد، صدا زد


مثال:
BEGIN TRY
    DECLARE @Number tinyint,
	    @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 20;
	
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    PRINT N'Error #: ' + CAST(@@ERROR AS NVARCHAR(50));
END CATCH

نتیجه ی زیر را بدست می دهد:
آموزش SQL

می توان مقدار بازگشتی تابع @@ERROR را بررسی کرده و شماره ی خطای رخ داده را با شماره ی دلخواه تطبیق دهید. اگر شماره ی مورد نظر باشد می توان عملیات مد نظر را انجام داد.
بررسی شماره خطا:
1. کد موجود در code editor را به صورت زیر ویرایش کنید:


BEGIN TRY
    DECLARE @Number tinyint,
	    @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 20;
	
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    IF @@ERROR = 220
        PRINT N'Something went wrong with your code';
END CATCH
GO

2. کلید F5 را برای اجرای مجموعه دستورات فشار دهید.


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

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


ERROR_MESSAGE() RETURNS nvarchar;

این تابع هیچ آرگومانی نمی گیرد و در خروجی یک رشته برمی گرداند. مثالی از فراخوانی این تابع را در زیر مشاهده می کنید:


BEGIN TRY
	DECLARE @Number tinyint,
	        @Result tinyint;
	
	SET @Number = 252;
	SET @Result = @Number + 20;
	
	SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
	PRINT ERROR_MESSAGE();
END CATCH

خروجی:
آموزش SQL

باتوجه به دانشی که از برنامه نویسی دارید، قطعا با معنی کلماتی نظیر overflow (سرریز)، error و tinyint آشنا هستید. متاسفانه، این پیام برای کاربر عادی قابل فهم نیست. به همین دلیل، باید روش موثری برای خواندن و درک پیام خطا درنظر بگیرید. به عنوان مثال، می توانید پیام خطای اختصاصی خود را با مقدار برگشتی تابع مزبور ترکیب کرده و یک پیغام قابل فهم ارائه کنید.


آموزش کاربردی: بازیابی پیام خطا


1. کد جاری را در code editor به صورت زیر ویرایش نمایید:


BEGIN TRY
    DECLARE @Number tinyint,
	    @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 20;
	
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    PRINT N'Error Message: ' + ERROR_MESSAGE();
END CATCH
GO

2. کد را اجرا کنید. نتیجه ی زیر را برمی گرداند:


آموزش SQL

تابع ERROR_SEVERITY()

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


ERROR_SEVERITY() RETURNS int;

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


BEGIN TRY
    DECLARE @Number tinyint,
	    @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 20;
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    PRINT N'Error Severity: ' + CAST(ERROR_SEVERITY() AS nvarchar(100));
END CATCH

نتیجه ی زیر را برمی گرداند:
آموزش SQL

مقدار بازگشتی نشانگر سطح و میزان شدت یک خطا نیست، بلکه تنها بیانگر شدت آن (مشکل ساز بودن آن) می باشد. در جایگاه یک توسعه دهنده و برنامه نویس پایگاه داده باید تشخیص داد که این عدد چیست و بر اساس آن اقدام لازم را انجام داد. می توان با استفاده از یک دستور شرطی IF مقدار بازگشتی این تابع را بدست آورده و عملیات دلخواه را انجام داد.


آموزش کاربردی

1. کد موجود در text editor را به صورت زیر ویرایش نمایید:


BEGIN TRY
    DECLARE @Number tinyint,
	    @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 20;
	
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    IF ERROR_SEVERITY() = 16
	PRINT N'An error has occurred on the database.';
	PRINT N'---------------------------------------------';
	PRINT N'The error severity number is 16.';
	PRINT N'Don''t panic at this time. Contact the';
	PRINT N'database administrator and specify this number.';
END CATCH
GO

2. با زدن F5 دستورات را اجرا نمایید.
خروجی:


آموزش SQL

تابع ERROR_STATE()

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


ERROR_STATE() RETURNS int;

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


نکاتی دیگر در خصوص مدیریت خطا


می توان بخش های مختلفی در کد خود را به مدیریت خطا و استثناها تخصیص داد.


مثال:
BEGIN TRY
    DECLARE @Number tinyint,
	    @Result tinyint;
	
    SET @Number = 252;
    SET @Result = @Number + 2;
	
    PRINT N'Number = ' + CAST(@Number AS nvarchar(20));
    PRINT N'Result = ' + CAST(@Result AS nvarchar(20));
END TRY
BEGIN CATCH
    PRINT N'Error: ' + ERROR_MESSAGE();
END CATCH
PRINT N'---------------------------------------';
BEGIN TRY
    DECLARE @Value decimal(6,2),
	    @Division decimal;
	
    SET @Value = 15.50;
    SET @Division = @Value / 2;
	
    PRINT N'Number = ' + CAST(@Value AS nvarchar(20));
    PRINT N'Result = ' + CAST(@Division AS nvarchar(20));
END TRY
BEGIN CATCH
    PRINT N'Error: ' + ERROR_MESSAGE();
END CATCH

نتیجه:
آموزش SQL
در این مثال، همان طور که می بینید هر بخش خطای مربوط به خود را اداره می کند.

آموزش کاربردی

1. دستورات موجود در code editor به ترتیب زیر اصلاح کنید:


BEGIN TRY
    DECLARE @Number tinyint,
	        @Result tinyint;
	
	SET @Number = 252;
	SET @Result = @Number + 42;
	
	PRINT N'Number = ' + CAST(@Number AS nvarchar(20));
	PRINT N'Result = ' + CAST(@Result AS nvarchar(20));
END TRY
BEGIN CATCH
	PRINT N'Error: ' + ERROR_MESSAGE();
END CATCH
PRINT N'---------------------------------------';
BEGIN TRY
	DECLARE @Value decimal(6,2),
			@Division decimal;
	
	SET @Value = 15.50;
	SET @Division = @Value / 0;
	
    PRINT N'Number = ' + CAST(@Value AS nvarchar(20));
	PRINT N'Result = ' + CAST(@Division AS nvarchar(20));
END TRY
BEGIN CATCH
	PRINT N'Error: ' + ERROR_MESSAGE();
END CATCH
GO

2. کد را اجرا نمایید:
نتیجه ی زیر را بازمی گرداند:


آموزش SQL

تودرتو کردن (Nest) یک استثنا در دل استثنای دیگر


می توانید یک کد ویژه ی مدیریت خطا در دل کد مدیریت خطای دیگر گنجاند. از این کار با نام تودرتو کردن یا به انگلیسی Nesting یاد می شود. فرمول آن به صورت زیر می باشد:


BEGIN TRY
    BEGIN TRY
	-- Nested try block
    END TRY
    BEGIN CATCH
	-- Nested catch block
    END CATCH
END TRY
BEGIN CATCH
END CATCH

آموزش کاربردی: nesting

1. کد موجود در text editor را به صورت زیر ویرایش نمایید:


BEGIN TRY
    BEGIN TRY
        DECLARE @Number tinyint,
	            @Result tinyint;
	
    	SET @Number = 252;
	    SET @Result = @Number + 42;
	
    	PRINT N'Number = ' + CAST(@Number AS nvarchar(20));
	    PRINT N'Result = ' + CAST(@Result AS nvarchar(20));
    END TRY
    BEGIN CATCH
		PRINT N'Error: ' + ERROR_MESSAGE();
    END CATCH
    PRINT N'---------------------------------------';
    BEGIN TRY
	    DECLARE @Value decimal(6,2),
		    	@Division decimal;
	
    	SET @Value = 15.50;
	    SET @Division = @Value / 0;
	
	    PRINT N'Number = ' + CAST(@Value AS nvarchar(20));
		PRINT N'Result = ' + CAST(@Division AS nvarchar(20));
    END TRY
    BEGIN CATCH
		PRINT N'Error: ' + ERROR_MESSAGE();
    END CATCH
END TRY
BEGIN CATCH
    PRINT N'There was a problem with your code';
END CATCH
GO

2. با فشردن کلید F5 کد را اجرا نمایید.
3. Query Editor را بسته و از محیط SQL Server خارج شوید.


تولید خطا (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 را بکار ببرید. فرمولی که می بایست برای نگارش دستور بکار ببرید، به صورت زیر می باشد:


THROW [ { error_number | @local_variable },
        { message | @local_variable },
    { state | @local_variable }
] [ ; ]

برای تولید و ارسال خطای اختصاصی خود، همان طور که ذکر شد لازم است یک دستور THROW در ساختمان CATCH بکار ببرید. پس از کلیدواژه ی THROW، یک عدد بزرگتر از 50000، کاراکتر ویرگول و به دنبال آن رشته ی متنی حاوی پیام خطا را وارد نموده و در پایان یک عدد طبیعی بین 0 تا 255 تایپ کنید.


مثال:
BEGIN TRY
    DECLARE @Number tinyint,
    @Result tinyint;
	
    SET @Number = 282;
    SET @Result = @Number + 20;
	
    SELECT @Number AS Number, @Result AS Result;
END TRY
BEGIN CATCH
    THROW 52000, N'There was an error when trying to excecute the statement.', 1;
END CATCH

آموزش SQL
  • 3846
  •    1084
  • تاریخ ارسال :   1394/12/03

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .