Введение в программирование
Обработка ошибок и исключения
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; }