at LoggingExceptions.main(LoggingExceptions.java:19)
Перехвачено LoggingException
Aug 30, 2005 4.02.31 PM LoggingException
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).
Спецификации исключений