Введение в программирование
Обработка ошибок и исключения
class Complex {
private final double re;
private final double im;
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
…
class Complex {
…
Complex divide(Complex c) {
double d = c.re * c.re + c.im * c.im;
return new Complex(
(re * c.re + im * c.im) / d,
(im * c.re - re * c.im) / d
);
}
if (Math.abs(d) < EPS) {
return null;
}
Complex c = a.divide(b);
if (c != null) {
// Ok
} else {
// Обработка ошибки
}
if Abs(d) < EPS {
return nil, fmt.Errorf("math: division by zero %g", f)
}
...
return value, nil
d, err := Divide(a, b)
if err != nil {
// Ok
} else {
// Обработка ошибки
}
if (Math.abs(d) < EPS) {
Complex.error = true;
return this;
}
Complex c = a.divide(b);
if (!Complex.error) {
// Ok
} else {
// Обработка ошибки
}
if (Math.abs(d) < EPS) {
return Complex.divisionByZeroError(a, b);
}
Complex.setDivisionByZeroHandler(...);
Complex c = a.divide(b); // Можно ли доверять c?
if (Math.abs(d) < EPS) {
System.exit(0);
return this;
}
// Без права на ошибку Complex c = a.divide(b);
if (Math.abs(d) < EPS) {
return Result.error(DBZ, "Division by zero");
}
...
return Result.success(value);
switch (a.divide(b)) {
case Success(d) -> {
// Ok
}
case Error(t, message) -> {
// Обработка ошибки
}
}
a.divide(b)
.onSuccess(d -> d.divide(c))
.recover(t, message) -> Complex.ZERO);
class DBZComplexException extends Exception {
private final Complex dividend;
public DBZComplexException(Complex d) {
this.dividend = d;
}
public Complex getDividend() {
return dividend;
}
}
Complex divide(Complex c)
throws DBZComplexException
{
…
if (Math.abs(d) < EPS) {
throw new DBZComplexException(d);
}
…
try {
Complex c = a.divide(b);
// Безопасное использование результата.
} catch (DBZComplexException e) {
// Обработка ошибки
}
Complex calculate(…) throws DBZComplexEx… {
Complex c = a.divide(b);
// Безопасное использование результата.
try {
// …
} catch (*Exception e) {
// Обработка
}
void method() throws *Exception { try {
// throws LogZeroComplexException
} catch (ComplexException e) {
// Обработка
}
public ComplexException extends Exception {
public ComplexException(String message) {
super(message);
}
public ComplexException(
String message,
Throwable cause
) {
super(message, cause);
}
}
try {
// Действия
} catch (*Exception e) {
// Обработка исключения
} catch (*Exception e) {
// Обработка исключения
} finally {
// Действия при выходе
}
try {
f();
} catch (*Exception e) {
}
f() { … g(); … }
g(){ … throw new *Exception(…); … }
// Получение ресурса
try {
// Действия с ресурсом
} finally {
// Освобождение ресурса
}
try {
int index = 0;
while (true) {
System.out.println(a[index++]);
}
} catch (IndexOutOfBoundsException e) {
}
try {
...
} catch (*Exception e) { }
try {
...
} catch (*Exception e) {
e.printStackTrace();
}
try {
...
} catch (RuntimeException e) {
// ?
} catch (Exception e) {
// ??
} catch (Throwable e) {
// ???
}
try { ...
} catch (IOException e) {
throw new APISpecificException(message, e);
}
try { ...
} catch (IOException e) {
e.printStackTrace();
throw new APISpecificException(message);
}
try (
Type var1 = …;
Type var2 = …;
…
) { … }
try (InputStream is = new FileInputStream("in")) {
System.out.println(is.read());
}
try {
…
} catch (SQLException e) {
throw new APISpecificException("Access error", e);
} catch (IOException e) {
throw new APISpecificException("Access error", e);
}
try {
…
} catch (IOException | SQLException e) {
throw new APISpecificException("Access error", e);
}
class CloneablePair {
Cloneable first;
Cloneable second;
}
/** Копирует пару.
Элементы пары клонируются. */
void copyOf(CloneablePair p)
void copyOf(CloneablePair p) {
first = p.first.clone();
second = p.second.clone();
}
void copyOf(CloneablePair p) {
first = p.first.clone();
try {
second = p.second.clone();
try { // Другие действия }
catch (*Exception e) {
second.close();
throw e;
}
} catch (*Exception e) {
first.close();
throw e;
}
}
void copyOf(CloneablePair p) {
Cloneable newFirst = p.first.clone();
second = p.second.clone();
first = newFirst;
}
void copyOf(CloneablePair p) {
Cloneable newFirst = p.first.clone();
try {
second = p.second.clone();
try { // Другие действия }
catch (*Exception e) { … }
first = newFirst;
} catch (*Exception e) {
newFirst.close();
throw e;
}
}
Cloneable newFirst = p.first.clone();
try {
Cloneable newSecond = p.second.clone();
try {
// Другие действия
first = newFirst; second = newSecond;
} catch (*Exception e) {
newSecond.close();
throw e;
}
} catch (*Exception e) {
newFirst.close();
throw e;
}