درخواست های ارتباط
جستجو
    لیست دوستان من
    صندوق پیام
    همه را دیدم
    • در حال دریافت لیست پیام ها
    صندوق پیام
    رویدادها
    همه را دیدم
    • در حال دریافت لیست رویدادها
    همه رویدادهای من

    تا 75 درصد تخفیف ویژه شب یلدا بر روی کلیه محصولات وب سایت توسینسو فقط تا 30 آذر

    مانده تا پایان تخفیف ها

    تخفیف های وب سایت
    همه تخفیف ها

    عضویت در

    کانال تلگرام

    توسینسو

    اطلاعات مطلب
      مدرس/نویسنده
      حسین احمدی
      امتیاز: 212242
      رتبه:3
      342
      253
      403
      2719
      حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ... پروفایل کاربر
      دوره های مرتبط
      دوره های توسینسو دوره آموزشی ساخت ربات تلگرام
      دوره آموزشی ساخت ربات تلگرام
      مدرس: کاظم تقندیکی
      این دوره را در 8 قسط خریداری کنید
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      ساخت و مدیریت ربات تلگرام از صفر با زبان سی شارپ
      مدرس: مهدی عادلی فر
      این دوره را در 2 قسط خریداری کنید
      دوره آموزشی Exploit نویسی به زبان Perl
      دوره آموزشی Exploit نویسی به زبان Perl
      مدرس: ایمان جوادی
      این دوره را در 7 قسط خریداری کنید
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      دوره آموزشی برنامه نویسی به زبان پرل بصورت پروژه محور
      مدرس: ایمان جوادی
      این دوره را در 13 قسط خریداری کنید
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      دوره آموزشی پردازش متن با زبان برنامه نویسی پایتون
      مدرس: کاظم تقندیکی
      این دوره را در 20 قسط خریداری کنید
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      دوره آموزشی برنامه نویسی اندروید با زبان جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 27 قسط خریداری کنید
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      دوره تخصصی آموزش متن کاوی با ابزار NLTK
      مدرس: کاظم تقندیکی
      این دوره را در 11 قسط خریداری کنید
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      دوره آموزشی مقدماتی برنامه نویسی به زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 17 قسط خریداری کنید
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      دوره آموزشی برنامه نویسی WPF در ویژوال استودیو
      مدرس: امیر حسین فضلیخانی
      این دوره را در 12 قسط خریداری کنید
      دوره آموزشی برنامه نویسی مقدماتی پایتون به زبان ساده
      دوره آموزشی برنامه نویسی مقدماتی پایتون به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 23 قسط خریداری کنید
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      دوره آموزشی برنامه نویسی پیشرفته زبان سی شارپ
      مدرس: حسین احمدی
      این دوره را در 78 قسط خریداری کنید
      دوره آموزشی طراحی رابط کاربری با JavaFX
      دوره آموزشی طراحی رابط کاربری با JavaFX
      مدرس: حسام رسولیان
      این دوره را در 13 قسط خریداری کنید
      دوره متوسطه برنامه نویسی به زبان جاوا به زبان ساده
      دوره متوسطه برنامه نویسی به زبان جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 18 قسط خریداری کنید
      دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      دوره آموزشی مقدماتی برنامه نویسی جاوا به زبان ساده
      مدرس: مهدی عادلی فر
      این دوره را در 17 قسط خریداری کنید
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      دوره آموزشی اسکریپت نویسی Batch یا Batch Scripting در ویندوز به زبان ساده
      مدرس: حسین احمدی
      این دوره را در 11 قسط خریداری کنید

      آموزش زبان سی شارپ -قسمت بیست و نهم (پایانی): استثناء ها (Exceptions) و مدیریت خطاها در سی شارپ

      تاریخ 32 ماه قبل
      نظرات 6
      بازدیدها 2991
      در قسمت پایانی آموزش برنامه نویسی به زبان سی شارپ، با مبحث Exception ها و مدیریت استثناها در زبان سی شارپ آشنا می شویم، بروز خطا در برنامه امری اجتناب نا پذیر است و یک برنامه نویس موظف است که خطاها را به درستی در برنامه ها مدیریت کرده و زمان بروز خطا، پیغامی مناسب به کاربر نمایش دهد. در زبان سی شارپ، به خطاها Exception یا استثنا می گویند. در برنامه های کامپیوتری خطاها بر دو دسته اند:

      1. خطاهای نحوی یا Syntax Errors: این خطاها به دلیل نوشتن اشتباه دستورات ایجاد شده و معمولاً زمان کامپایل برنامه قابل رفع هستند.
      2. خطاهای منطقی یا Logical Errors: این خطاها به دلیل انجام اشتباه یک عملیات یا ورود اشتباه یک دستور در زمان اجرا اتفاق می افتند.

      بیشترین تمرکز ما برای مدیریت خطاها، روی دسته دوم خطاهاست، برای شروع کد زیر را در نظر بگیرید:

      var firstNumber = int.Parse(Console.ReadLine());
      var secondNumber = int.Parse(Console.ReadLine());
      
      Console.WriteLine(firstNumber/secondNumber);
      

      کد بالا، دو عدد را از ورودی خوانده و حاصل تقسیم این دو عدد را در خروجی چاپ می کند، اما فرض کنید مقدار عدد دوم صفر وارد شود، امکان تقسیم اعداد بر عدد صفر وجود ندارد و در صورت ورود عدد صفر به عنوان ورودی دوم، با پیغام خطای DivideByZero مواجه می شویم. برای رفع ایین مشکل، می بایست از مکانیزم کنترل Exception ها استفاده کنیم. در زبان سی شارپ این مکانیزم، با ساختار try..catch انجام می شود:

      try
      {
          // place your code here
      }
      catch([ExceptionType])
      {
      }
      catch([ExceptionType])
      {
      }
      finally
      {
      }
      

      قسمتی از کد که احتمال وقوع خطا در آن وجود دارد را باید داخل بدنه try بنویسید، با این کار، در صورت وقوع خطا در کدی که داخل بدنه try نوشته شده، قسمت catch اجرا می شود. اما نحوه اجرای قسمت catch به چه صورت است؟ در کتابخانه، برای هر نوع خطا، یک کلاس تعریف شده، برای مثال، برای خطای تقسیم بر صفر کلاسی با نام DivideByZeroException وجود دارد، کلاً تمامی کلاس های مرتبط با خطا های مختلف با کلمه Exception تمام می شوند، کلاس هایی مانند InvalidOperationException یا StackOverlowException، تمامی این کلاس از کلاس پایه ای با نام SystemException مشتق شده اند که خود کلاس SysteException از کلاس Exception مشتق شده است، در حقیقت کلاس Exception کلاس پایه ای برای کلیه خطاهای سیستم می باشد. حال شما بر اساس نوع خطایی که قصد مدیریت آن را دارید، نام Data Type آن را در مقابل catch می نویسید، برای مثال، اگر تصمیم دارید خطای تقسیم بر صفر را مدیریت کنید، ساختار try..catch به صورت زیر نوشته می شود:

      try
      {
      
      }
      catch (DivideByZeroException)
      {                
      }
      

      در صورتی که خطای تقسیم بر صفر در سیستم رخ دهد، بدنه catch اجرا خواهد شد، کد ابتدای آموزش را به صورت زیر تغییر می دهیم:

      try
      {
          var firstNumber = int.Parse(Console.ReadLine());
          var secondNumber = int.Parse(Console.ReadLine());
      
          Console.WriteLine(firstNumber / secondNumber);
      }
      catch (DivideByZeroException)
      {
          Console.WriteLine("Second number must be greater than zero!");
      }
      
      Console.ReadKey();
      

      با اجرای کد بالا، در صورتی که عدد دوم را صفر وارد کنیم، به جای متوقف شدن برنامه و بروز خطا، پیغام مناسب برای کاربر نمایش داده می شود. اما نکته ای که وجود دارد، شما می توانید بیشتر از یک بدنه catch داشته باشید. برای مثال، در کد بالا در صورتی که شما به جای عدد کاراکتر a را وارد کنید، با خطای FormatException مواجه می شوید، برای مدیریت این خطا کافیست کد بالا را به صورت زیر تغییر دهید:

      try
      {
          var firstNumber = int.Parse(Console.ReadLine());
          var secondNumber = int.Parse(Console.ReadLine());
      
          Console.WriteLine(firstNumber/secondNumber);
      }
      catch (DivideByZeroException)
      {
          Console.WriteLine("Second number must be greater than zero!");
      }
      catch (FormatException)
      {
          Console.WriteLine("Invalid input format!");
      }
      

      با کد بالا، در صورت اشتباه در ورودی، خطا مدیریت شده و پیغام مناسب نمایش داده می شود. قسمت دیگر ساختار try..catch، بدنه finally می باشد، این قسمت از ساختار، در هر صورت اجرا خواهد شد، چه خطا رخ بدهد، چه خطا رخ ندهد، کد بالا را به صورت زیر تغییر می دهیم:

      try
      {
          var firstNumber = int.Parse(Console.ReadLine());
          var secondNumber = int.Parse(Console.ReadLine());
      
          Console.WriteLine(firstNumber/secondNumber);
      }
      catch (DivideByZeroException)
      {
          Console.WriteLine("Second number must be greater than zero!");
      }
      catch (FormatException)
      {
          Console.WriteLine("Invalid input format!");
      }
      finally
      {
          Console.WriteLine("Thank you for choosing ITPRO.IR!");
      }
      

      با کد بالا، پیغام داخل بدنه finally در هر صورت در خروجی چاپ خواهد شد، استفاده از بدنه finally بیشتر زمانی کاربرد دارد که شما می خواهید بعد از اتمام عملیات، اقدام به پاک سازی حافظه و آزاد سازی منابع کنید.

      امکان مدیریت خطاها به صورت عمومی نیز وجود دارد، گفتیم کلیه کلاس های مربوط به خطاها از کلاس Exception مشتق شده اند، برای مدیریت عمومی خطاها، کافیست در بدنه catch به جای یک نوع مشخص از خطا، نام Exception را بنویسیم:

      try
      {
          var firstNumber = int.Parse(Console.ReadLine());
          var secondNumber = int.Parse(Console.ReadLine());
      
          Console.WriteLine(firstNumber/secondNumber);
      }
      catch (Exception)
      {
          Console.WriteLine("Oops! Your input stopped me!");
      }
      

      با کد بالا دیگر نوع خطا تفاوتی نمی کند، با وقوع هر خطایی، پیغام داخل بدنه catch در خروجی چاپ می شود.

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

      try
      {
          var firstNumber = int.Parse(Console.ReadLine());
          var secondNumber = int.Parse(Console.ReadLine());
      
          Console.WriteLine(firstNumber/secondNumber);
      }
      catch (Exception ex)
      {
          Console.WriteLine(ex.Message);
          Console.WriteLine(ex.StackTrace);
          Console.WriteLine(ex.InnerException.ToString());
      }
      

      همانطور که مشاهده می کنید کلاس Exception شامل یکسری خصوصیات است، در زیر به بررسی مهمترین خصوصیات کلاس Exception می پردازیم:

      1. خصوصیت Message: این خصوصیت حاوی پیغام خطای تولید شده توسط برنامه است
      2. خصوصیت StackTrace: این خصوصیت شامل جزئیاتی از خطای رخ داده شده است، ممکن است خطاها در هر قسمت از برنامه رخ دهند، بوسیله stack trace قابلیت ردیابی خطا و اینکه وقوع این خطا بعد از فراخوانی کدام متدها و در کدام فایل و خط از برنامه اتفاق افتاده را خواهیم داشت.
      3. خصوصیت InnerException: گاهی اوقات، یک خطا می تواند شامل یک خطای درونی باشد، برای مثال، شما زمانی که با بانک SQL Server کار می کنید، ممکن از زمان کار با بانک، خطایی دریافت کنید، خصوصیت Inner Exception اطلاعات جزئی تری از خطاهای اتفاق افتاده به شما می دهد. این خصوصیت از نوع Exception بوده و اطلاعات خطاهای درونی یک خطا را به ما می دهد.


      خطاهای دلخواه و دستور throw


      در زبان سی شارپ امکان تعریف خطاهای دلخواه وجود دارد، همانطور که در قسمت قبلی گفتیم، هر خطا از کلاس SystemException مشتق شده که خود SystemException از کلاس Exception مشتق می شود، در دات نت کلاس دیگری وجود دارد به نام ApplicationException که از کلاس Exception مشتق شده و ما می توانیم با ایجاد کلاس هایی که از ApplicationException مشتق شده اند، خطاهای دلخواه خود را تعریف کنیم. برای مثال، کد زیر را در نظر بگیرید:

      public class StudentManager
      {
          public void RegisterStudent(string firstName, string lastName, byte age)
          {
              // add student to database
          }
      }
      

      فرض کنید، می خواهیم از ثبت نام افرادی که سنشان کمتر از 18 سال است جلوگیری کنیم. برای اینکار می توانیم به این صورت عمل کنیم، ابتدا یک کلاس برای خطای سن کمتر از 18 سال تعریف می کنیم:

      public class InvalidAgeException : ApplicationException
      {
          public InvalidAgeException(string message) : base(message)
          {
          }
      }
      

      دقت کنید به عنوان پارامتر ورودی سازنده، پیغام خطا را دریافت و به سازنده کلاس پدر ارسال می کنیم. حال باید از این خطا در کلاس StudentManager استفاده کنیم، یعنی با ورود سن کمتر از 18 سال، خطای InvalidAgeException صادر شود، در زبان سی شارپ، برای صدور خطا از دستور throw استفاده می کنیم:

      public class StudentManager
      {
      public void RegisterStudent(string firstName, string lastName, byte age)
      {
      if (age < 18)
      throw new InvalidAgeException("Age must be greater that 18!");
      // add student to database
      }
      }

      در مرحله بعد، با اجرای دستور زیر خطا دریافت خواهیم کرد:

      new StudentManager().RegisterStudent("Hossein", "Ahmadi", 17);
      

      حال می توانیم با ساختار try..catch این خطا را مدیریت کنیم:

      try
      {
      
      }
      catch (InvalidAgeException ex)
      {
          Console.WriteLine(ex.ToString());
          throw;
      }
      

      همانطور که مشاهده می کنید در ساختار بالا، خطای InvalidAgeException مدیریت شده و پیغام خطا در خروجی چاپ می شود.

      در این قسمت از آموزش ما با مفهوم Exception ها و نحوه مدیریت خطاها در زبان سی شارپ آشنا شدیم، همچنین با تعریف و تولید خطاهای دلخواه (دستور throw) آشنا شدیم. با اتمام این بخش، آموزش مقدماتی زبان سی شارپ به پایان می رسد. با حدود 30 قسمت و 35 بخش، مباحث مقدماتی سی شارپ را آموختیم. امیدوارم که این مجموعه بتواند سهم کوچکی در یادگیری دوستان داشته باشد. ITPRO باشید

      نویسنده : حسین احمدی
      منبع : جزیره برنامه نویسی وب سایت توسینسو
      هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است
      برچسب ها
      ردیفعنوان
      1دوره آموزشی .NET Framework و زبان برنامه نویسی سی شارپ - مقدمه
      2آموزش سی شارپ - قسمت اول :: معرفی و بررسی ابزارهای مورد نیاز دوره
      3آموزش زبان سی شارپ - قسمت دوم :: آشنایی با .NET Framework و ساختار آن (بخش اول)
      4آموزش زبان سی شارپ - قسمت دوم :: آشنایی با .NET Framework و ساختار آن (بخش دوم)
      5آموزش زبان سی شارپ - قسمت سوم :: آشنایی اولیه با محیط Visual Studio و نوشتن اولین برنامه
      6آموزش زبان سی شارپ - قسمت چهارم :: آشنایی با ساختار برنامه ها و کامپایلر زبان سی شارپ
      7آموزش زبان سی شارپ - قسمت پنجم :: آشنایی با دستورات کنسول و متغیرها
      8آموزش زبان سی شارپ - قسمت ششم :: نوع های داده اولیه
      9آموزش زبان سی شارپ - قسمت هفتم :: آشنایی با عملگرهای زبان سی شارپ
      10آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش اول)
      11آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش دوم)
      12آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش سوم)
      13آموزش زبان سی شارپ - قسمت هشتم :: آشنایی با دستورات کنترلی و حلقه ها (بخش چهارم)
      14آموزش زبان سی شارپ - قسمت نهم :: آشنایی با آرایه ها و دستور foreach
      15آموزش زبان سی شارپ - قسمت دهم :: آشنایی با متدها در زبان سی شارپ (بخش اول)
      16آموزش زبان سی شارپ - قسمت دهم :: آشنایی با متدها در زبان سی شارپ (بخش دوم)
      17آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت یازدهم :: مقدمه ای بر برنامه نویسی شئ گرا
      18آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت دوازدهم :: آشنایی با کلاس، اشیاء و فضاهای نام
      19آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت سیزدهم :: آشنایی با فیلدها و رفتارها
      20آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت چهاردهم :: آشنایی با Property ها
      21آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت پانزدهم :: آشنایی با سازنده ها و روش های ایجاد اشیاء
      22آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت شانزدهم :: وراثت یا Inheritance
      23آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت هفدهم :: آشنایی با مفهوم Polymorphism
      24آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت هجدهم:: کلاس های abstract و sealed
      25آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت نوزدهم :: سازنده ها در وراثت، کلمه کلیدی protected و فیلدهای readonly
      26آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیستم :: کلاس های static و partial و Extension Method ها
      27آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و یکم :: Reference Types و Value Types
      28آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و دوم :: آشنایی با کاربرد interface ها
      29آموزش برنامه نویسی شئ گرا در زبان سی شارپ - قسمت بیست و سوم :: آشنایی با مفاهیم Inversion of Control و Dependency Injection
      30آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و چهارم :: آشنایی با مفهوم Type Casting و انواع Cast ها
      31آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و پنجم :: آشنایی با operator overloading و تعریف cast ها
      32آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و ششم :: مفاهیم boxing و unboxing
      33آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و هفتم :: قابلیت Generics
      34آموزش برنامه نویسی شئ گرا در زبان سی شارپ -قسمت بیست و هشتم :: نکات تکمیلی Generic ها، کلاس List و کلاس Dictionary
      35آموزش زبان سی شارپ -قسمت بیست و نهم (پایانی): استثناء ها (Exceptions) و مدیریت خطاها در سی شارپ
      دورهمجموعه کل دوره
      مطالب مرتبط

      در حال دریافت اطلاعات

      نظرات
      • خسته نباشید. سری آموزشی بسیار مفیدی بود. متشکر
      • امیدوارم مورد اسنفاده واقع شده باشه.
      • سلامی دوباره این آموزش بازم ادامه داره مثلا درس 36 به بعد یا تا همین جاست؟
      • قسمت های بعدی داخل سایت قرار گرفته، اما به صورت سریالی نیست، برای مثال بحث Reflection در یک سری جداگانه یا بحث کار با فایل هم همینطور. در حال حاضر بخش Asynchronous Programming در حال تکمیل است.
      • خیلی عالیه پس من اینهارو خوب یاد بگیرم تابقیه آماده بشن پیشاپیش هم خسته نباشید

      • این پست حذف شده است
        دلیل حذف: این نظر جنبه تبلیغاتی دارد.

      • سلام آقای احمدی درصورتی که برنامه زیر بره تو حلقه تکرار و توی سه مرحله امتحان کنیم اول ورودی هارو عدد وارد کنیم و خروجی رو ببینم مثلا 4و0 مرحله بعدی رشته وعدد وارد کنیم وبعد مرحله بعد بیام عدد وارد کنیم اما خطای که میده میگه ورودی string شما فرمت صحیح نمی باشد در صورتی که ورودی ها عدد هستند مثلا 4 و 2 باز همان خطا را میده ولی اگه یه عدد چند رقم ی بزنی مشکل درست میشه.
           while (true)
                    {
                        int FirstNumber = 0;
                        int SecondNumber = 0;
                        try
                        {
                            FirstNumber = int.Parse(Console.ReadLine());
                            SecondNumber = int.Parse(Console.ReadLine());
                            Console.WriteLine(FirstNumber / SecondNumber);
                        }
                        catch (DivideByZeroException ex )
                        {
                            Console.WriteLine(ex.Message);
                        }
                        catch (FormatException ex )
                        {
                            Console.WriteLine(ex.Message);
                        }
                        finally
                        {
                            Console.ReadKey();
                        }
        

      برای ارسال نظر ابتدا به سایت وارد شوید