برخورد با استثناها (Exception Handling)
در اين درس با چگونگی برخورد با استثناها (يا خطاهاي غير قابل پيشبيني) در زبان برنامهسازي C# آشنا ميشويم. اهداف ما در اين درس بشرح زير ميباشد :
1) درک و فهم صحيح يک استثناء يا Exception
2) پيادهسازي يک روتين براي برخورد با استثناها بوسيله بلوک try/catch
3) آزادسازي منابع تخصيص داده شده به يک برنامه در يک بلوک finally
استثناها، در حقيقت خطاهاي غير منتظره در برنامههاي ما هستند. اکثراً، ميتوان و بايد روشهايي را جهت برخورد با خطاهای موجود در برنامه در نظر گرفت و آنها را پيادهسازی کرد. بعنوان مثال، بررسي و تاييد دادههای ورودی کاربران، بررسی اشياء تهی يا Null و يا بررسی نوع بازگشتی متد ها، ميتوانند از جمله مواردی باشند که بايد مورد بررسی قرار گيرند. اين خطاها، خطاهايی معمول و رايجی هستند که اکثر برنامهنويسان از آنها مطلع بوده و راههايی را برای بررسی آنها در نظر ميگيرند تا از وقوع آنها جلوگيری نمايند.
اما زمانهايي وجود دارند که از اتفاق افتادن يک خطا در برنامه بی اطلاع هستيد و انتظار وقوع خطا در برنامه را نداريد. بعنوان مثال، هرگز نميتوان وقوع يک خطای I/O را پيشبينی نمود و يا کمبود حافظه برای اجرای برنامه و از کار افتادن برنامه به اين دليل. اين موارد بسيار غير منتظره و ناخواسته هستند، اما در صورت وقوع بهتر است بتوان راهی برای مقابله و برخورد با آنها پيدا کرده و با آنها برخورد نمود. در اين جاست که مسئله برخورد با استثناها (Exception Handling) مطرح ميشود.
هنگاميکه استثنايی رخ ميدهد، در اصطلاح ميگوئيم که اين استثناء، thrown شده است. در حقيقت thrown، شیءای است مشتق شده از کلاس System.Exception که اطلاعاتی در مورد خطا يا استثناء رخ داده را نشان ميدهد. در قسمتهای مختلف اين درس با روش مقابله با استثناها با استفاده از بلوک های try/catch آشنا خواهيد شد.
کلاس System.Exception حاوی تعداد بسيار زيادی متد و property است که اطلاعات مهمی در مورد استثناء و خطای رخ داده را در اختيار ما قرار ميدهد. برای مثال، Message يکی از property های موجود در اين کلاس است که اطلاعاتی درباره نوع استثناء رخ داده در اختيار ما قرار ميدهد. StackTrace نيز، اطلاعاتی در مورد Stack (پشته) و محل وقوع خطا در Stack در اختيار ما قرار خواهد داد.
تشخيص چنين استثناهايی، دقيقاً با روتينهای نوشته شده توسط برنامهنويس در ارتباط هستند و بستگی کامل به الگوريتمی دارد که وی برای چنين شرايطی در نظر گرفته است. برای مثال، در صورتيکه با استفاده از متد System.IO.File.OpenRead()، اقدام به باز کردن فايلی نماييم، احتمال وقوع (Thrown) يکی از استثناهای زير وجود دارد :
SecurityException
ArgumentException
ArgumentNullException
PathTooLongException
DirectoryNotFoundException
UnauthorizedAccessException
FileNotFoundException
NotSupportedException
با نگاهی بر مستندات .Net Framework SDK، به سادگی ميتوان از خطاها و استثناه