यूज़र-डिफाइंड एक्सेप्शन आपके कोड में बनाई गई कोई भी ऐसी क्लास है जो System.Exception से व्युत्पन्न होती है। ऐसी क्लास पर क्लास इनहेरिटेंस के सारे नियम लागू होते हैं। इसके अलावा कंपाइलर और भाषा का रनटाइम ऐसी क्लासों के साथ एक खास तरीके से व्यवहार करते हैं, जिससे exceptions अभ्यास में बताए अनुसार उनके इंस्टेंस सामान्य कंट्रोल फ्लो से बाहर भी थ्रो और कैच किए जा सकते हैं। यूज़र-डिफाइंड एक्सेप्शन का इस्तेमाल हर उसी तरह किया जा सकता है जैसे रनटाइम और Microsoft Base Class Library के एक्सेप्शन का किया जाता है।
यह खास व्यवहार सिर्फ 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) { }
}