Взято з: тут
Збільшення та вилучення винятків не повинно відбуватися як частина успішного виконання методу. Розробляючи бібліотеки класів, клієнтському коду необхідно надати можливість перевірити стан помилки перед тим, як здійснити операцію, що може призвести до виникнення виключення. Наприклад, System.IO.FileStream надає властивість CanRead, яку можна перевірити до виклику методу Read, запобігаючи підвищенню потенційного винятку, як показано у наведеному нижче фрагменті коду:
Dim str As Stream = GetStream () If (str.CanRead) Потім 'код для читання потоку End End
Рішення про те, чи слід перевіряти стан об’єкта до виклику певного методу, який може призвести до винятку, залежить від очікуваного стану об’єкта. Якщо об’єкт FileStream створений за допомогою шляху до файлу, який повинен існувати, і конструктора, який повинен повернути файл у режимі читання, перевірка властивості CanRead не потрібна; неможливість прочитати FileStream було б порушенням очікуваної поведінки зроблених викликів методу, і слід винести виняток. На противагу цьому, якщо метод задокументований як повернення посилання на FileStream, яке може бути або не може бути читабельним, перевірка властивості CanRead перед спробою зчитування даних є доцільною.
Щоб проілюструвати вплив продуктивності, який може спричинити використання методу кодування "запустити до винятку", продуктивність передачі, яка видає InvalidCastException, якщо виникла невдача, порівнюється з оператором C # як оператор, який повертає нулі, якщо випуск не вдається. Виконання двох методів ідентично для випадку, коли амплуа є дійсним (див. Тест 8.05), але для випадку, коли амплуа недійсний, а використання анотації спричиняє виняток, використання кастингу в 600 разів повільніше, ніж використання як оператор (див. Тест 8.06). Високопродуктивний вплив техніки викидання винятків включає витрати на розподіл, викидання та вилов винятку та витрати на подальше вивезення сміття об’єкта виключення, що означає, що миттєвий вплив викидання виключення не такий високий. Оскільки викидів більше,