Exception
є базовим типом для всіх винятків, і як такий жахливо неспецифічний. Ніколи не слід кидати цей виняток, оскільки він просто не містить корисної інформації. Виклик вибору коду за винятками не міг відмежувати навмисно викинуте виняток (з вашої логіки) від інших системних винятків, які є абсолютно небажаними та вказують на справжні помилки.
Ця ж причина стосується і SystemException
. Якщо ви подивитесь на перелік похідних типів, ви можете побачити величезну кількість інших винятків з дуже різною семантикою.
NullReferenceException
і IndexOutOfRangeException
мають різний вид. Зараз це дуже конкретні винятки, тому кидати їх можна було б чудово. Однак ви все одно не хочете їх кидати, оскільки вони зазвичай означають, що в вашій логіці є деякі фактичні помилки. Наприклад, виключення з нульовою посиланням означає, що ви намагаєтеся отримати доступ до члена об'єкта, який є null
. Якщо така можливість є у вашому коді, то завжди слід чітко перевірити null
і замість цього викинути корисніше виключення (наприклад ArgumentNullException
). Аналогічно, IndexOutOfRangeException
s трапляються, коли ви отримуєте доступ до недійсного індексу (для масивів - не списків). Ви завжди повинні переконатися, що ви цього не робите в першу чергу і спочатку перевірте межі, наприклад, масив.
Є кілька інших винятків , наприклад , ті два, наприклад , InvalidCastException
або DivideByZeroException
, які викидаються для конкретних помилок в коді і , як правило , означають , що ви робите що - то неправильно або ви не перевіряючи для деяких неприпустимих значень першого. Закидаючи їх свідомо з вашого коду, ви просто ускладнюєте код, який викликає, щоб визначити, чи були вони кинуті через якусь несправність у коді, чи просто тому, що ви вирішили використати їх для чогось у вашій реалізації.
Звичайно, є деякі винятки (га) цих правил. Якщо ви будуєте щось, що може спричинити виняток, який точно відповідає існуючому, тоді сміливо використовуйте це, особливо якщо ви намагаєтесь відповідати деякій вбудованій поведінці. Просто переконайтеся, що тоді ви вибрали дуже конкретний тип виключення.
Однак загалом, якщо ви не знайдете (конкретний) виняток, який задовольняє ваші потреби, завжди слід розглянути можливість створення власних типів винятків для конкретних очікуваних винятків. Особливо, коли ви пишете код бібліотеки, це може бути дуже корисно для відокремлення джерел виключень.