مقابله با خطا ها در سی شارپ
مقابله با خطاها در سی شارپ (Exception Handling in C#)
EXCEPTION یک خطای زمان اجر است که بدلیل شرایطی
غیرنرمال در برنامه ایجاد می شود. در سی شارپ exeption کلاسی است در فضای نام سیستم. شیء ایی
از نوع exception بیانگر
شرایطی است که سبب رخ دادن خطا در کد شده است. سی شارپ از exception ها به صورتی بسیار شبیه به جاوا و سی
پلاس پلاس استفاده می نماید.
دلایلی که باید در برنامه exception
handling
حتما صورت گیرد به شرح زیر است:
- قابل صرفنظر کردن نیستند و اگر کدی
این موضوع را در نظر نگیرد با یک خطای زمان اجرا خاتمه پیدا خواهد کرد.
-
سبب مشخص شدن خطا در یک نقطه از برنامه شده و ما را به اصلاح آن سوق می
دهد.
بوسیله ی عبارات try...catch
می توان مدیریت خطاها را انجام داد. کدی که احتمال دارد خطایی در آن رخ
دهد درون try قرار گرفته و سپس
بوسیله ی یک یا چند قطعه ی catch
می توان آنرا مدیریت کرد. و اگر از این قطعات خطایابی استفاده نشود برنامه
به صورتهای زیر متوقف خواهد شد :
class A {static void
Main() {catch {}}}
TEMP.cs(3,5): error CS1003: Syntax error, 'try'
expected
class A {static void Main() {finally {}}}
TEMP.cs(3,5):
error CS1003: Syntax error, 'try' expected
class A {static void
Main() {try {}}}
TEMP.cs(6,3): error CS1524: Expected catch or
finally
بهتر است یک مثال ساده را در این زمینه مرور کنیم:
int a, b = 0 ;
Console.WriteLine(
"My program starts " ) ;
try
{
a = 10 / b;
}
catch (
Exception e )
{
Console.WriteLine ( e ) ;
}
Console.WriteLine
( "Remaining program" ) ;
The output of the program is:
My
program starts
System.DivideByZeroException: Attempted to divide by
zero.
at ConsoleApplication4.Class1.Main(String[ ] args) in
d:\dont
delete\consoleapplication4\class1.cs:line 51
Remaining program
برنامه شروع به اجرا می کند. سپس وارد بلوک و یا قطعه ی
try می گردد. اگر هیچ خطایی هنگام اجرای
دستورات داخل آن رخ ندهد ، برنامه به خط آخر جهش خواهد کرد و کاری به قطعات
catch ندارد.
اما در اینجا در اولین try عددی بر صفر تقسیم شده است بنابراین
کنترل برنامه به بلوک catch
منتقل می شود و صرفا نوع خطای رخ داده شده نوشته و نمایش داده می شود. سپس
برنامه به کار عادی خودش ادامه می دهد.
تعدادی از کلاس های exception در سی شارپ که از کلاس System.Exception ارث برده اند به شرح زیر هستند :
• Exception Class - -
Cause
• SystemException - A failed run-time check;used as a base
class for other.
• AccessException - Failure to access a type
member, such as a method or field.
• ArgumentException - An argument
to a method was invalid.
• ArgumentNullException - A null argument
was passed to a method that doesn't accept it.
•
ArgumentOutOfRangeException - Argument value is out of range.
•
ArithmeticException - Arithmetic over - or underflow has occurred.
•
ArrayTypeMismatchException - Attempt to store the wrong type of object
in an array.
• BadImageFormatException - Image is in the wrong
format.
• CoreException - Base class for exceptions thrown by the
runtime.
• DivideByZeroException - An attempt was made to divide by
zero.
• FormatException - The format of an argument is wrong.
•
IndexOutOfRangeException - An array index is out of bounds.
•
InvalidCastExpression - An attempt was made to cast to an invalid class.
• InvalidOperationException - A method was called at an invalid
time.
• MissingMemberException - An invalid version of a DLL was
accessed.
• NotFiniteNumberException - A number is not valid.
•
NotSupportedException - Indicates sthat a method is not implemented by a
class.
• NullReferenceException - Attempt to use an unassigned
reference.
• OutOfMemoryException - Not enough memory to continue
execution.
• StackOverflowException - A stack has overflown.
در کد فوق صرفا عمومی ترین نوع از این کلاس ها که شامل تمامی این موارد می شود مورد استفاده قرار گرفت یعنی :
catch ( Exception e )
اگر نیازی به خطایابی دقیقتر باشد می توان از کلاس های
فوق برای اهداف مورد نظر استفاده نمود.
مثالی دیگر: ( در این مثال
خطایابی دقیق تر با استفاده از کلاس های فوق و همچنین مفهوم finally نیز گنجانده شده است )
int a, b = 0 ;
Console.WriteLine(
"My program starts" ) ;
try
{
a = 10 / b;
}
catch (
InvalidOperationException e )
{
Console.WriteLine ( e ) ;
}
catch ( DivideByZeroException e)
{
Console.WriteLine ( e ) ;
}
finally
{
Console.WriteLine ( "finally" ) ;
}
Console.WriteLine
( "Remaining program" ) ;
The output here is:
My program starts
System.DivideByZeroException: Attempted to divide by zero.
at
ConsoleApplication4.Class1.Main(String[ ] args) in
d:\dont
delete\consoleapplication4\class1.cs:line 51
finally
Remaining
program
قسمت موجود در قطعه ی فاینالی همواره صرفنظر از قسمت
های دیگر اجرا می شود.
به مثال زیر دقت کنید :
int a, b = 0 ;
Console.WriteLine(
"My program starts" )
try
{
a = 10 / b;
}
finally
{
Console.WriteLine ( "finally" ) ;
}
Console.WriteLine (
"Remaining program" ) ;
Here the output is
My program starts
Exception
occurred: System.DivideByZeroException:
Attempted to divide by
zero.at ConsoleApplication4.Class1.
Main(String[ ] args) in d:\dont
delete\consoleapplication4
\class1.cs:line 51
finally
قسمت چاپ Remaining program
اجرا نشده است.
عبارت throw :
این عبارت سبب ایجاد یک خطا در برنامه می
شود.
مثال :
int a, b = 0 ;
Console.WriteLine(
"My program starts" ) ;
try
{
a = 10 / b;
}
catch (
Exception e)
{
throw
}
finally
{
Console.WriteLine
( "finally" ) ;
}
در این حالت قسمت فاینالی اجرا شده و برنامه بلافاصله خاتمه پیدا می کند