استثنای تعریفشده توسط کاربر هر کلاسی است که در کد شما تعریف میشود و از System.Exception مشتق شده باشد. چنین کلاسی از همهی قواعد ارثبری کلاسها تبعیت میکند، اما علاوه بر آن، کامپایلر و زمان اجرای زبان با این کلاسها رفتار ویژهای دارند و اجازه میدهند نمونههایشان بیرون از جریان عادی کنترل پرتاب و گرفته شوند. این موضوع در تمرین exceptions بررسی شده است. استثناهای تعریفشده توسط کاربر را میتوان دقیقاً مانند استثناهای زمان اجرا و کتابخانهی کلاس پایهی مایکروسافت به هر شکلی به کار برد.
این رفتار ویژه فقط به کلاسهای مشتقشده از Exception مربوط است. نمیتوانید نمونههایی از هیچ نوع دیگری را پرتاب کنید.
از استثناهای تعریفشده توسط کاربر اغلب برای حمل اطلاعات اضافی، مانند یک پیام و سایر دادههای مرتبط، استفاده میشود تا در اختیار روالهای گیرنده قرار گیرد. این اطلاعات میتواند در لاگها ثبت شود، به کاربر گزارش شود یا شاید در یک عملیات تلاش مجدد به کار رود. System.Exception اعضای دادهی کارآمد و سازندههای مناسبی دارد که میتوانند یک پیام و استثنای درونی را در خود نگه دارند.
بر اساس یک قرارداد، اسم کلاسهای استثنا با «Exception» تمام میشود، مثلاً MyTerribleException.
هرچند بهکار بردن استثناهای تعریفشده توسط کاربر برای بستهبندی و بهبود استثناهای شخص ثالث الگویی پرتکرار است، توصیهی کلی این است که بیرون از این مورد، در کد خودتان بیش از حد از آن استفاده نکنید. این کار یک ضدالگو به شمار میرود. اما این دیدگاه مخالفانی هم دارد و هر دو طرف بحث را میتوانید در این پست Stack Exchange ببینید.
این مقاله مقدمهی خوبی برای استثناهای تعریفشده توسط کاربر است.
تیم .NET در بخشی از راهنمایی خود دربارهی ساختن و پرتاب استثناها توصیه میکند که استثناهای تعریفشده توسط کاربر تعدادی سازندهی آماده داشته باشند. برای بیشتر کاربردها، ترکیب نشاندادهشده در زیر مناسب است.
public class IncompleteExerciseException : System.Exception
{
public IncompleteExerciseException() : base() { }
public IncompleteExerciseException(string message) : base(message) { }
public IncompleteExerciseException(string message, System.Exception inner) : base(message, inner) { }
}