Исключения и обработка ошибок

Средства обнаружения ошибок

  • в С
    • соглашение о возвращаемых значениях
    • переменная errno
  • соглашение между разработчиками
  • можно не знать или забыть
  • читаемость кода падает

Проблема

  • Появляется ошибочная ситуация
  • Можем не знать, что делать
  • Продолжать работу нельзя
  • Кто-то должен что-то сделать

Бросание исключений

if (t == null)

throw new NullPointerException();

throw new NullPointerException("t = null");

Обработка исключений

try {

// Code that might generate exceptions

} catch (Type1 id1) {

// Handle exceptions of Type1

} catch (Type2 id2) {

// Handle exceptions of Type2

} catch (Type3 id3) {

// Handle exceptions of Type3

} finally {

// Stuff that happens all the time

}

Типы исключений

throws

void f() throws A, B, C { ...

Методы Throwable

String getMessage( )

String toString( )

void printStackTrace( )

void printStackTrace(PrintStream)

Пример

public class ExceptionMethods {

public static void main(String[] args) {

try {

throw new Exception("Here's my Exception");

} catch(Exception e) {

System.out.println("Caught Exception");

System.out.println("e.getMessage(): " + e.getMessage());

System.out.println("e.toString(): " + e.toString());

System.out.println("e.printStackTrace():");

e.printStackTrace();

}

}

}

Вывод

Caught Exception

e.getMessage(): Here's my Exception

e.toString(): java.lang.Exception: Here's my Exception

e.printStackTrace():

java.lang.Exception: Here's my Exception at ExceptionMethods.main

Перебрасывание исключений

catch (Exception e) {

System.out.println("An exception was thrown");

throw e;

}

Метод fillInStackTrace( )

Создание своих исключений

class MyException extends Exception {

public MyException() {}

public MyException(String msg) {

super(msg);

}

}

Пример

public class Inheriting {

public static void f() throws MyException {

System.out.println("Throwing MyException from f()");

throw new MyException();

}

public static void g() throws MyException {

System.out.println("Throwing MyException from g()");

throw new MyException("Originated in g()");

}

Пример (2)

public static void main(String[] args) {

try {

f();

} catch(MyException e) {

e.printStackTrace();

}

try {

g();

} catch(MyException e) {

e.printStackTrace();

}

}

}

Вывод

Throwing MyException from f()

MyException

at Inheriting.f(Inheriting.java:16)

at Inheriting.main(Inheriting.java:24)

Throwing MyException from g()

MyException: Originated in g()

at Inheriting.g(Inheriting.java:20)

at Inheriting.main(Inheriting.java:29)

Не злоупотребляйте исключениями

Исключения НЕ стоит использовать:

  • Асинхронные события
  • Устранимые ошибки
  • Управление последовательностью выполнения кода
  • Небольшие программы
Лекция 03b. Исключения, обработка ошибок - Google Slides