Створення нових типів виключень

Винятки в Java являють собою обєкти Всі типи винятків (тобто всі класи, обєкти яких порушуються в якості винятків) повинні розширювати клас мови Java, який називається Throwable, або один з його підкласів Клас Throwable містить рядок, яка може використовуватися для опису винятку За угодою, нові типи винятків розширюють клас Exception, а не Throwable

Винятки Java, головним чином, є перевіряються – Це означає, що компілятор стежить за тим, щоб ваші методи порушували лише ті винятки, про які оголошено в заголовку методу Стандартні виключення часу виконання і помилки розширюють класи RuntimeException і Error, тим самим створюючи непроверяемие винятку Усі винятки, обумовлені програмістом, повинні розширювати клас Exception, і, таким чином, вони є перевіряються

Іноді хочеться мати більше даних, що описують стан винятку, – одного рядка, що надається класом Exception, виявляється недостатньо У таких випадках можна розширити клас Exception і створити на його основі новий клас з додатковими даними (значення яких зазвичай задаються в конструкторі)

Наприклад, припустимо, що в інтерфейс Attributed, розглянутий у розділі 4, додався метод replaceValue, який замінює поточне значення іменованого атрибута новим Якщо атрибут з вказаним імям не існує, збуджується виключення – цілком резонно припустити, що замінити неіснуючий атрибут не вдасться Виключення повинне містити імя атрибута і нове значення, яке намагалися йому привласнити Для роботи з таким винятком створюється клас NoSuchAttribiteException:

public class NoSuchAttributeException extends Exception {

public String attrName

public Object newValue

NoSuchAttributeException(String name, Object value) { super(&quotNo attribute named \&quot&quot + name + &quot\&quot found&quot) attrName = name

newValue = value

}

}

NoSuchAttribiteException розширює Exception і включає конструктор, якому передається імя атрибута і присваиваемое значення крім того, додаються відкриті поля для зберігання даних Усередині конструктора викликається конструктор суперкласу з рядком, що описує, що відбувається Винятки такого роду можуть використовуватися у фрагменті програми, перехоплювали винятку, оскільки вони виводять зрозуміле людині опис помилки і дані, що викликали її Додавання корисної

інформації – одна з причин, по яких створюються нові винятки

Інша причина для появи нових типів виключень полягає в тому, що тип є важливою частиною даних винятку, оскільки виключення перехоплюються по їх типу З цих міркувань виняток NoSuch AttribiteException варто створити навіть у тому випадку, якщо ви не збираєтеся включати в нього нові дані в цьому випадку програміст, для якого представляє інтерес тільки це виняток, зможе перехопити його окремо від усіх інших винятків, що запускаються методами інтерфейсу Attributed чи іншими методами, застосовуваними до інших обєктів в тому ж фрагменті програми

У загальному випадку виключення нових типів слід створювати тоді, коли програміст хоче обробляти помилки одного типу і пропускати помилки іншого типу У цьому випадку він може скористатися новими винятками для виконання потрібного фрагмента програми, замість того щоб вивчати вміст обєкта-винятки і вирішувати, чи цікавить його дане виключення або ж воно не відноситься до справи і перехоплено випадково

72 Оператор throw

Винятки збуджуються оператором throw, якому як параметр передається обєкт Наприклад, ось як виглядає реалізація replaceValue в класі AttributedImpl з глави 4:

public void replaceValue(String name, Object newValue)

throws NoSuchAttributeException

{

Attr attr = find (name) / / Шукати attr

if (attr == null) / / Якщо атрибут не найден

throw new NoSuchAttributeException(name, this)

attrvalueOf(newValue)

}

Метод replaceValue спочатку шукає імя атрибута в поточному обєкті Attr Якщо атрибут не знайдений, то порушується обєкт-виняток типу NoSuch AttribiteException і його конструктору надаються змістовні дані Винятки є

обєктами, тому перед використанням їх необхідно створити Якщо атрибут не існує, то його значення замінюється новим

Зрозуміло, виключення може бути породжене викликом методу, усередині якого воно збуджується

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*