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();
}
}
|
|