Werfen (und fangen) Throwable (oder Exception) ist in der Regel eine schlechte Übung, da es bestimmte Ausnahmen "überdeckt", die Sie vielleicht fangen möchten. Dann würden Sie wie unten an Hässlichkeit zurückgreifen:
public void myMethod() throws Throwable {
if (x) {
throw new MyException1();
}
if (y) {
throw new MyException2();
}
}
public void callingMethod() {
try {
myMethod();
}
catch(Throwable t) {
if (t instanceof MyException1) {
// handle exception 1
}
else if (t instanceof MyException2) {
// handle exception 2
}
else {
// handle other exceptions
}
}
}
Welche ist fehleranfällig (und durch Check als Codeverletzung markiert). Es ist viel preferrable Code wie diese zu haben:
public void myMethod() throws MyException1, MyException2 {
if (x) {
throw new MyException1();
}
if (y) {
throw new MyException2();
}
}
public void callingMethod() {
try {
myMethod();
}
catch(MyException1 e) {
// handle exception 1
}
catch(MyException2 e) {
// handle exception 2
}
}
eine Ausnahmebehandlung nur durch den Aufruf von print() ist in der Regel keine gute Idee. printStackTrace() sendet den Stacktrace an den Standardfehler, der überhaupt nicht gelesen werden kann. Eine bessere Option ist die Protokollierung der Anwendung (wie log4j), um die Ausnahme zu melden. Selbst dann könnte es einfach nicht reichen, es einfach zu protokollieren.
Faust Meine Regel ist:
Wenn Sie eine Ausnahme lokal verarbeiten kann, so tun. Zum Beispiel, wenn das Parsen einen String als Integer Sie die Number fangen können und einen Standardwert zurück:
prvate int parseAmount(String amountValue) {
int amount;
try {
amount = Integer.parseInt(amountValue);
}
catch(NumberFormatException e) {
// default amount
amount = 0;
}
return amount;
}
Wenn Sie keine Ausnahme lokal verarbeiten können, sollten Sie, wenn Sie den Ausnahmetyp aussetzen sollten, die ausgelöst wird.Wenn diese Art einig obskurer (abhängig von der Implementierung) Typ ist, dann ist es in Ihrem eigenen generischen Ausnahmetyp Verpackung ist wahrscheinlich eine gute Idee:
private Customer getCustomer(int customerId) throws ServiceException {
try {
return customerService.getCustomer(customerId);
}
catch(CustomerServiceSpaghettiTangledException e) {
throw new ServiceException("Error calling the customer service", e);
}
}
Hier ServiceException 'ist eine Unterklasse von Exception von Euch erstellt. Frühling bietet auch eine exception hierarchy speziell für diesen Zweck.
Durch die Umgehung der Ausnahme verbergen Sie die Implementierungsdetails, wodurch Ihre Serviceebene wesentlich einfacher zu verwenden ist.
Wenn Sie entscheiden, eine Ausnahme von Ihrer Methode zu werfen, müssen Sie sie im Callstack "höher" behandeln. Dies kann eine generische Fehlerseite in Ihrer Webanwendung sein, die besagt, dass etwas schief gelaufen ist und möglicherweise eine Fehlermeldung oder einen Code enthält. In einigen Fällen kann der Code auf höherer Ebene einen erneuten Versuch oder möglicherweise einen alternativen Weg zum Erhalten des erforderlichen Ergebnisses versuchen.
wahrscheinlich wird dies Ihnen eine Erklärung geben: http://StackOverflow.com/Questions/498217/When-Should-Throwable-be-used-instead-of-new-Exception – Serge
"Throws Throwable" ist häufiger in SDKs und Framework-Definitionen. Hier ist ein Beispiel im Android-Test-Framework, in dem sie es verwenden: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/test/ InstrumentationTestCase.java # InstrumentationTestCase –