مقابله با خطا ها در سی شارپ
مقابله با خطاها در سی شارپ (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" ) ; 
} 
در این حالت قسمت فاینالی اجرا شده و برنامه بلافاصله خاتمه پیدا می کند
