دسته بندی مقالات
- بیشتر -محصولات
- بیشتر -آخرین مقالات
- بیشتر --
دستور select در SQL Server
1403/09/30 -
استثناءهای اداره نشده در سی شارپ
1403/09/29 -
نرمالسازی در SQL Server
1403/09/28 -
تعریف یک استثناء توسط کاربر در سی شارپ
1403/09/27 -
کلید اصلی و خارجی در SQL Server
1403/09/26 -
StackTrace در سی شارپ
1403/09/25
استثناءهای اداره نشده در سی شارپ
استثناءهای اداره نشده در سی شارپ (Unhandled Exceptions in C#)
استثناءهای اداره نشده زمانی رخ میدهند که برنامه در مواجهه با یک خطا نتواند بهصورت صحیح به آن رسیدگی کند.
این خطاها باعث میشوند برنامه بهطور ناگهانی متوقف شود.
بهطور معمول، این استثناءها در شرایطی رخ میدهند که توسعهدهنده مدیریت مناسبی برای خطاها پیشبینی نکرده است.
برخی از دلایل رایج این نوع استثناءها عبارتند از:
-
تلاش برای دسترسی به شیئی که مقدار null دارد (خطای NullReferenceException).
-
دسترسی به ایندکسی خارج از محدوده یک آرایه (خطای IndexOutOfRangeException).
-
تقسیم یک عدد بر صفر (خطای DivideByZeroException).
-
تبدیل نوع نامعتبر (خطای InvalidCastException).
مدیریت استثناءهای اداره نشده
برای مدیریت این نوع استثناءها، میتوان از بلوکهای try-catch استفاده کرد.
در این بلوکها، کدی که احتمال بروز خطا در آن وجود دارد در قسمت try قرار میگیرد و در صورت رخ دادن خطا، قسمت catch اجرا میشود.
مثال زیر را در نظر بگیرید:
try
{
int result = 10 / 0; // خطای تقسیم بر صفر
}
catch (DivideByZeroException ex)
{
Console.WriteLine($"خطا: {ex.Message}");
}
اگر استثناء اداره نشده باقی بماند، میتواند به توقف برنامه منجر شود.
برای مقابله با این موضوع، میتوان از مدیریت خطای کلی استفاده کرد.
در برنامههای کنسولی، این کار با ثبت رویداد UnhandledException انجام میشود:
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
Console.WriteLine($"Unhandled Exception: {((Exception)args.ExceptionObject).Message}");
};
در محیطهای وب مانند ASP.NET Core نیز میتوان از Middlewareها برای مدیریت خطا استفاده کرد:
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
context.Response.StatusCode = 500;
context.Response.ContentType = "text/plain";
await context.Response.WriteAsync("خطای غیرمنتظره رخ داده است.");
});
});
ابزارهای ثبت خطا و نظارت
برای ثبت و پیگیری استثناءها میتوان از ابزارهایی مانند Serilog و NLog استفاده کرد.
این ابزارها اطلاعات کاملی از خطا شامل نوع، پیام و زمان وقوع را ذخیره میکنند.
خطای زمان اجرا (Runtime Error)
خطای زمان اجرا به خطاهایی گفته میشود که هنگام اجرای برنامه رخ میدهند.
این خطاها معمولاً به دلیل مشکلات غیرمنتظره در ورودیها، منابع یا منطق برنامهنویسی رخ میدهند.
برخلاف خطاهای کامپایلری که پیش از اجرای برنامه شناسایی میشوند، خطاهای زمان اجرا تنها در زمان اجرا قابل مشاهده هستند.
🌟 آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
شرکت در دوره آموزش برنامه نویسی سی شارپ
انواع رایج خطاهای زمان اجرا
-
NullReferenceException
تلاش برای استفاده از شیئی که مقدار null دارد.
مثال:
string text = null;
Console.WriteLine(text.Length); // خطای NullReferenceException
-
IndexOutOfRangeException
دسترسی به ایندکسی خارج از محدوده یک آرایه.
مثال:
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers[5]); // خطای IndexOutOfRangeException
-
DivideByZeroException
تقسیم یک عدد بر صفر.
مثال:
int result = 10 / 0; // خطای DivideByZeroException
-
InvalidOperationException
انجام عملیات نامعتبر در یک شیء.مثال:
var enumerator = new List<int>().GetEnumerator();
enumerator.MoveNext();
Console.WriteLine(enumerator.Current); // خطای InvalidOperationException
مدیریت خطاهای زمان اجرا
مدیریت خطاهای زمان اجرا به معنای جلوگیری از توقف غیرمنتظره برنامه است.
استفاده از بلوکهای try-catch میتواند کمککننده باشد.
همچنین، برای جلوگیری از وقوع این خطاها، باید اعتبارسنجی ورودیها و شرایط کد را بهدرستی انجام داد.
-
مثال مدیریت خطاهای زمان اجرا
try
{
string[] names = { "Ali", "Reza" };
Console.WriteLine(names[5]); // خطای IndexOutOfRangeException
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine($"خطای رخ داده: {ex.Message}");
}
-
جلوگیری از خطاهای زمان اجرا
-
استفاده از شرطها برای اطمینان از معتبر بودن مقادیر:
-
if (names.Length > 5)
{
Console.WriteLine(names[5]);
}
-
-
استفاده از متدهای ایمن مانند TryParse برای تبدیل مقادیر.
-
if (int.TryParse("123", out int number))
{
Console.WriteLine($"عدد معتبر: {number}");
}
else
{
Console.WriteLine("ورودی معتبر نیست.");
}
استثناهای سفارشی (Custom Exceptions)
گاهی ممکن است نیاز باشد خطاهای خاصی را برای برنامه خود تعریف کنیم که استثناءهای موجود پوشش نمیدهند.
در این مواقع، استثناهای سفارشی یا Custom Exceptions به کار میآیند.
این استثناءها با ارثبری از کلاس Exception ایجاد میشوند.
مزایای استثناهای سفارشی
-
ارائه اطلاعات خاصتر در مورد خطاها.
-
امکان تمایز بین خطاهای مختلف در سیستمهای بزرگ.
-
افزایش شفافیت و قابلیت دیباگ کد.
نحوه ایجاد استثناء سفارشی
برای ایجاد یک استثناء سفارشی، باید یک کلاس جدید ایجاد کرد و از کلاس Exception ارثبری کرد.
مثال زیر نحوه تعریف و استفاده از یک استثناء سفارشی را نشان میدهد:
public class CustomException : Exception
{
public CustomException(string message) : base(message)
{
}
}
// استفاده از استثناء سفارشی
try
{
throw new CustomException("این یک خطای سفارشی است.");
}
catch (CustomException ex)
{
Console.WriteLine($"خطای سفارشی: {ex.Message}");
}
افزودن اطلاعات اضافی به استثناء
میتوان ویژگیهای خاصی را به کلاس استثناء سفارشی اضافه کرد تا اطلاعات بیشتری درباره خطا ارائه شود. بهعنوان مثال:
public class ValidationException : Exception
{
public string PropertyName { get; }
public ValidationException(string message, string propertyName) : base(message)
{
PropertyName = propertyName;
}
}
// استفاده از ValidationException
try
{
throw new ValidationException("مقدار نامعتبر است.", "Username");
}
catch (ValidationException ex)
{
Console.WriteLine($"خطا: {ex.Message} در {ex.PropertyName}");
}
بهترین روشها در استفاده از استثناهای سفارشی
-
استثناء سفارشی فقط در صورتی ایجاد شود که خطای خاصی نیاز به تعریف داشته باشد.
-
پیامهای خطا باید دقیق و قابلفهم باشند.
-
از مستندسازی خطاها و موارد استفاده استثناء سفارشی اطمینان حاصل شود.
مثال پروژهمحور سیستم مدیریت کاربران با مدیریت استثناءها
در این پروژه کوچک، یک سیستم مدیریت کاربران داریم که شامل ثبتنام کاربران، دریافت اطلاعات، و حذف آنها است.
این سیستم باید بتواند خطاهای مختلف (مانند ورود دادههای نامعتبر، دسترسی به ایندکس نامعتبر، یا عملیات غیرمجاز) را مدیریت کند.
-
تعریف کلاسهای اصلی
ابتدا کلاس کاربر را تعریف میکنیم:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public User(int id, string name, string email)
{
Id = id;
Name = name;
Email = email;
}
}
-
تعریف استثناء سفارشی برای اعتبارسنجی
یک استثناء سفارشی برای مدیریت خطاهای مرتبط با اعتبارسنجی ورودی ایجاد میکنیم:
public class ValidationException : Exception
{
public ValidationException(string message) : base(message) { }
}
-
پیادهسازی منطق مدیریت کاربران
یک کلاس برای مدیریت عملیات مرتبط با کاربران ایجاد میکنیم:
using System.Collections.Generic;
public class UserManager
{
private List<User> users = new List<User>();
public void AddUser(User user)
{
if (string.IsNullOrWhiteSpace(user.Name))
{
throw new ValidationException("نام کاربر نمیتواند خالی باشد.");
}
if (string.IsNullOrWhiteSpace(user.Email) || !user.Email.Contains("@"))
{
throw new ValidationException("ایمیل نامعتبر است.");
}
users.Add(user);
Console.WriteLine("کاربر با موفقیت اضافه شد.");
}
public User GetUserById(int id)
{
var user = users.Find(u => u.Id == id);
if (user == null)
{
throw new KeyNotFoundException("کاربر با این شناسه یافت نشد.");
}
return user;
}
public void RemoveUser(int id)
{
var user = GetUserById(id);
users.Remove(user);
Console.WriteLine("کاربر با موفقیت حذف شد.");
}
}
-
اجرای پروژه و مدیریت استثناءها
در برنامه اصلی، از این کلاسها استفاده میکنیم و استثناءهای ممکن را مدیریت میکنیم:
using System;
class Program
{
static void Main(string[] args)
{
UserManager userManager = new UserManager();
try
{
Console.WriteLine("در حال افزودن کاربر جدید...");
userManager.AddUser(new User(1, "علی", "ali@example.com"));
Console.WriteLine("در حال دریافت اطلاعات کاربر...");
var user = userManager.GetUserById(1);
Console.WriteLine($"کاربر یافت شد: {user.Name}, {user.Email}");
Console.WriteLine("در حال حذف کاربر...");
userManager.RemoveUser(1);
Console.WriteLine("در حال دریافت کاربر حذف شده...");
userManager.GetUserById(1); // اینجا خطا رخ خواهد داد
}
catch (ValidationException ex)
{
Console.WriteLine($"خطای اعتبارسنجی: {ex.Message}");
}
catch (KeyNotFoundException ex)
{
Console.WriteLine($"خطای کلید: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"خطای عمومی: {ex.Message}");
}
}
}
-
خروجی برنامه
وقتی برنامه بدون خطا اجرا شود:
در حال افزودن کاربر جدید...
کاربر با موفقیت اضافه شد.
در حال دریافت اطلاعات کاربر...
کاربر یافت شد: علی, ali@example.com
در حال حذف کاربر...
کاربر با موفقیت حذف شد.
در حال دریافت کاربر حذف شده...
خطای کلید: کاربر با این شناسه یافت نشد.
اگر نام یا ایمیل کاربر خالی باشد:
خطای اعتبارسنجی: نام کاربر نمیتواند خالی باشد.
تحلیل پروژه
-
استثناء سفارشی: خطاهای مرتبط با اعتبارسنجی با استفاده از استثناء سفارشی مدیریت شدند.
-
خطاهای عمومی: از KeyNotFoundException برای مدیریت کاربرانی که پیدا نمیشوند استفاده شده است.
-
پایداری: حتی با رخ دادن خطاها، برنامه بهجای توقف غیرمنتظره، آنها را شناسایی و بهدرستی مدیریت میکند.
-
این روش باعث بهبود تجربه کاربری و کاهش خطاهای پیشبینی نشده میشود.
دوره های مرتبط
آموزش برنامه نویسی سی شارپ
زبان شی گرایی حرفه ای سی شارپ یک زبان قدرتمند برای طراحی نرم افزار به شمار میرود.