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

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

Жанры

Философия 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), входит в объявление метода и следует сразу за списком аргументов.

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

Царь царей

Билик Дмитрий Александрович
9. Бедовый
Фантастика:
фэнтези
мистика
5.00
рейтинг книги
Царь царей

Законы Рода. Том 14

Андрей Мельник
14. Граф Берестьев
Фантастика:
аниме
фэнтези
эпическая фантастика
5.00
рейтинг книги
Законы Рода. Том 14

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9

Точка Бифуркации VI

Смит Дейлор
6. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации VI

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам

Студиозус

Шмаков Алексей Семенович
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус

Лекарь Империи 9

Карелин Сергей Витальевич
9. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
Лекарь Империи 9

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Рассвет русского царства

Грехов Тимофей
1. Новая Русь
Документальная литература:
историческая литература
5.00
рейтинг книги
Рассвет русского царства

Первый среди равных. Книга VIII

Бор Жорж
8. Первый среди Равных
Фантастика:
аниме
фантастика: прочее
эпическая фантастика
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VIII

Отморозок 5

Поповский Андрей Владимирович
5. Отморозок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Отморозок 5

Император Пограничья 4

Астахов Евгений Евгеньевич
4. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 4

На границе империй. Том 10. Часть 9

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 9

Отморозок 4

Поповский Андрей Владимирович
4. Отморозок
Фантастика:
попаданцы
фантастика: прочее
5.00
рейтинг книги
Отморозок 4