Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

StringWriter trace = new StringWriter; printStackTrace(new PrintWriter(trace)), 1ogger.severe(trace.toStri ng),

public class LoggingExceptions {

public static void main(String[] args) { try {

throw new LoggingException; } catch(LoggingException e) {

System.err.println("Перехвачено " + e),

}

try {

throw new LoggingExceptionO: } catch(LoggingException e) {

System.err.println("Перехвачено " + e),

} /* Output (85Х match)

Aug 30, 2005 4:02:31

РМ LoggingException <init> SEVERE LoggingException

at LoggingExceptions.main(LoggingExceptions.java:19)

Перехвачено LoggingException

Aug 30, 2005 4.02.31 PM LoggingException <init>

SEVERE LoggingException

at Loggi ngExcepti ons.mai n(Loggi ngExcepti ons.j ava:24)

Перехвачено LoggingException */// -

Статический метод Logger.getLogger создает объект Logger, ассоциируемый с аргументом String (обычно имя пакета и класса, к которому относятся ошибки); объект передает свой вывод в System.err. Простейший способ записи информации в Logger заключается в вызове метода, соответствующего уровню ошибки; в нашем примере используется метод severe. Нам хотелось бы создать String для регистрируемого сообщения из результатов трассировки стека, но метод printStackTrace по умолчанию не создает String. Для получения String необходимо использовать перегруженную версию printStackTrace с аргументом java.io.PrintWriter (за подробными объяснениями обращайтесь к главе «Ввод/вывод»). Если передать конструктору PrintWriter объект java.io. StringWriter, для получения вывода в формате String достаточно вызвать toString.

Подход LoggingException чрезвычайно удобен (вся инфраструктура регистрации встроена в само исключение, и все работает автоматически без вмешательства со стороны клиента), однако на практике чаще применяется перехват и регистрация «сторонних» исключений, поэтому сообщение должно генерироваться в обработчике исключения:

//: exceptions/LoggingExceptions2.java // Регистрация перехваченных исключений, import java.util.logging.*; import java.io.*:

public class LoggingExceptions2 { private static Logger logger =

Logger.getLogger("Loggi ngExcepti ons2"): static void logException(Exception e) {

StringWriter trace = new StringWriter; e.printStackTrace(new PrintWriter(trace)): 1ogger.severe(trace.toStri ng);

}

public static void main(String[] args) { try {

throw new NullPointerException; } catch(NullPointerException e) { logException(e):

}

}

} /* Output: (90* match)

Aug 30, 2005 4:07:54 PM LoggingExceptions2 logException

SEVERE: java.lang.NullPointerException продолжение &

at LoggingExceptions2 main(LoggingExceptions2 java:16)

*///.-

На этом процесс создания собственных исключений не заканчивается — исключение можно снабдить дополнительными конструкторами и элементами:

//: exceptions/ExtraFeatures.java // Дальнейшее расширение классов исключений, import static net.mindview.util.Print.*:

class MyException2 extends Exception { private int x; public MyException2 {} public MyException2(String msg) { super(msg): } public MyException2(String msg, int x) { super(msg): this.x = x:

}

public int valО { return x: } public String getMessageO {

return "Подробное

сообщение: "+ x + " " + super getMessageO:

public class ExtraFeatures {

public static void f throws MyException2 { print("MyException2 в f"), throw new MyException2:

}

public static void g throws MyException2 {

System out.println("MyException2 в g"); throw new MyException2("Возбуждено в g");

}

public static void h throws MyException2 {

System out.println("MyException2 в h"): throw new MyException2("Возбуждено в h", 47);

}

public static void main(String[] args) { try {

f:

} catch(MyException2 e) {

e.printStackTrace(System.out);

}

try {

g:

} catch(MyException2 e) {

e.printStackTrace(System out):

}

try {

h:

} catch(MyException2 e) {

e.printStackTrace(System.out):

System out.printlnC'e.valO = " + e.valO):

}

}

} /* Output: MyException2 в f

MyException2: Подробное сообщение: 0 null

at ExtraFeatures.f(ExtraFeatures.java•22)

at ExtraFeatures.main(ExtraFeatures.java.34) MyException2 в g

MyException2: Подробное сообщение: 0 Возбуждено в g

at ExtraFeatures.g(ExtraFeatures.java:26) at ExtraFeatures.main(ExtraFeatures.java:39) MyException2: Подробное сообщение: 47 Возбуждено в h at ExtraFeatures.h(ExtraFeatures.java:30) at ExtraFeatures.main(ExtraFeatures.java:44)

e.valO = 47 *///:-

Было добавлено поле данных х вместе с методом, считывающим его значение, а также дополнительный конструктор для инициализации х. Переопределенный метод Throwable.getMessage выводит более содержательную информацию об исключении. Метод getMessage для классов исключений — аналог toStringO в обычных классах.

Так как исключение является просто видом объекта, расширение возможностей классов исключений можно продолжить. Однако следует помнить, что все эти программисты, использующие ваши библиотеки, могут попросту проигнорировать все «украшения» — нередко программисты ограничиваются проверкой типа исключения (как чаще всего бывает со стандартными исключениями Java).

Спецификации исключений

В языке Java желательно сообщать программисту, вызывающему ваш метод, об исключениях, которые данный метод способен возбуждать. Пользователь, вызывающий метод, сможет написать весь необходимый код для перехвата возможных исключений. Конечно, когда доступен исходный код, программист-клиент может пролистать его в поиске предложений throw, но библиотеки не всегда поставляются с исходными текстами. Чтобы библиотека не превращалась в «черный ящик», в Java добавили синтаксис (обязательный для использования), при помощи которого вы сообщаете клиенту об исключениях, возбуждаемых методом, чтобы он сумел правильно обработать их. Этот синтаксис называется спецификацией исключений (exception specification), входит в объявление метода и следует сразу за списком аргументов.

Поделиться:
Популярные книги

Попаданка 3

Ахминеева Нина
3. Двойная звезда
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка 3

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья

Два лика Ирэн

Ром Полина
Любовные романы:
любовно-фантастические романы
6.08
рейтинг книги
Два лика Ирэн

Одержимый

Поселягин Владимир Геннадьевич
4. Красноармеец
Фантастика:
боевая фантастика
5.00
рейтинг книги
Одержимый

Испытание Огня

Гаврилова Анна Сергеевна
3. Академия Стихий
Фантастика:
фэнтези
9.43
рейтинг книги
Испытание Огня

Измена. Возвращение любви!

Леманн Анастасия
3. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Возвращение любви!

An ordinary sex life

Астердис
Любовные романы:
современные любовные романы
love action
5.00
рейтинг книги
An ordinary sex life

Миф об идеальном мужчине

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.23
рейтинг книги
Миф об идеальном мужчине

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Невеста клана

Шах Ольга
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Невеста клана

В семье не без подвоха

Жукова Юлия Борисовна
3. Замуж с осложнениями
Фантастика:
социально-философская фантастика
космическая фантастика
юмористическое фэнтези
9.36
рейтинг книги
В семье не без подвоха

Возвышение Меркурия. Книга 15

Кронос Александр
15. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 15

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

Младший сын князя

Ткачев Андрей Сергеевич
1. Аналитик
Фантастика:
фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Младший сын князя