Da WikiSitech.
<< Back to Java
Log what is happened
Per avere un log 'utilizzabile' è necessario che l'eccezione venga loggata al massimo due volte:
- Chi intercetta l'eccezione originale deve loggare senza lo stacktrace e trasformarla in un eccezione applicativa
 
- Chi intercetta l'eccezione applicativa deve loggare l'eccezione completa di stacktrace
 
tutti gli altri punti in cui passa l'eccezione devono propagarla senza intercettarla e riloggarla nuovamente 
Bad Practice.....case 1
public class A {
 
  public static void f() throws TExcept {
     try {
        // Do something
     } catch(Throwable t) {
        // non viene loggato la causa dell'eccezione
        throw new TExcept(t);
     }
  }
}
 public class B  {
 
  void f1() {
     try {
        A.f();
     } catch(TExcept t) {
        // l'eccezione viene nascosta
     }      
  }
}
 
 | 
Bad Practice.....case 2
public class A {
 
  public static void f() throws TExcept {
     try {
        // Do something
     } catch(Throwable t) {
        // questo non è log...viene solo messo in console
        t.printStackTrace(); 
        throw new TExcept(t);
     }
  }
}
 public class B  {
 
  void f1() {
     try {
        A.f();
     } catch(TExcept t) {
        // questo non è log...viene solo messo in console
        t.printStackTrace();
     }      
  }
}
 
 | 
Bad Practice.....case 3
public class A {
 
  public static void f() throws TExcept {
     try {
        // Do something
     } catch(Throwable t) {
        // questo non è log...viene solo messo in console
        System.out.println(t.getMessage();
        throw new TExcept(t);
     }
  }
}
 public class B  {
 
  void f1() {
     try {
        A.f();
     } catch(TExcept t) {
        // questo non è log...viene solo messo in console
        System.out.println(t.getMessage();
     }      
  }
}
 
 | 
Not Bad Practice but...
public class A {
 
  public static void f() throws TExcept {
     try {
        // Do something
     } catch(Throwable t) {
        // viene loggato tutto lo stackTrace
        log.error("error", t);
        throw new TExcept(t);
     }
  }
}
 public class B  {
 
  void f1() {
     try {
        A.f();
     } catch(TExcept t) {
        // viene loggato tutto lo stackTrace per la seconda volta
        log.error("error", t);
     }      
  }
}
 
 | 
Best Practice
Nell'esempio della Best Practice è stato aggiunta la classe C per mostrare che bisogna fare con la propagazione dell'eccezione
 
| 
 Nel caso in cui l'eccezione sia di competenza di C
public class A {
 
  public static void f() throws TExcept {
     try {
        // Do something
     } catch(Throwable t) {
        log.error(t.getMessage());
        throw new TExcept(t);
     }
  }
}
 public class B  {
 
  public static void f1() throws TExcept {
     A.f();
  }
}
 public class C  {
 
  void f2() {
     try {
        B.f1();
     } catch(TExcept t) {
        log.error("error", t);
     }      
  }
}
 
 | 
 Nel caso in cui l'eccezione sia di competenza di B
public class A {
 
  public static void f() throws TExcept {
     try {
        // Do something
     } catch(Throwable t) {
        log.error(t.getMessage());
        throw new TExcept(t);
     }
  }
}
 public class B  {
 
  public static void f1() {
     try {
        A.f();
     } catch(TExcept t) {
        log.error("error", t);
     }      
  }
}
 public class C  {
 
  void f2() {
     B.f1();
  }
}
 
 |   
 |