2017-02-01 2 views
2

ich eine große Familie von Ausnahmen hat:Eine große Familie der Ausnahme. Eine Art und Weise zu organisieren, es

class A extends Exception {} 
class A1 extends A {} 
class A2 extends A {} 
... 
class A40 extends A {} 

Keine Ausnahme kann „repariert“ werden, aber jede Ausnahme muss als Fehler Benutzer angezeigt werden. Jede Ausnahme (ihr Typ) trägt eine andere Information, so dass ich die Anzahl der Ausnahmen nicht "reduzieren" kann. Da der Benutzer benachrichtigt werden muss, wird jede ausgelöste Ausnahme an die GUI "gezogen".

Es ist problematisch? Warum? Zum Beispiel:

private void f() throws A1, A2, ..., A20 {} 

A einige Lösung (*) könnte sein:

private void f() throws A {} 

Und, um Ausnahmetyp "erholen":

void function_in_GUI(){ 
try { 

} catch(A a){ 
    handle(a); 
} 

void handle(A a){ 
    try{ 
    throw a; 
    } catch(A1 a){ 
    notify_user(); 
    } catch(A2 a){ 
    .... 
    } 
    .... 

} 

} 
  1. Was denken Sie über (*)?
  2. Der cannonical Weg, es zu tun ist ...
+0

Gibt es etwas über diese Ausnahmen? Können sie dieselbe Ausnahmeklasse mit unterschiedlichen Attributen sein? –

+1

* "... eine weitere Information, so dass ich die Anzahl der Ausnahmen nicht reduzieren kann" * - Ich bezweifle ernsthaft die Aussage, dass sie nicht reduziert werden kann. –

+2

Der kanonische Weg ist * nicht * eine große Anzahl von Ausnahmen zu erstellen. Ich habe in 20 Jahren weniger Ausnahmen geschrieben als in diesem Beispiel. – Kayaman

Antwort

0

Runtime Erweiterung hat hier viele Vorteile. Sie müssen die Ausnahme nicht überall deklarieren oder abfangen, sondern die RuntimeException nur an einem einzigen Ort abfangen, um das Problem mit den zusätzlichen Informationen für den Benutzer anzuzeigen.

2

Idealerweise haben Sie in einer solchen Klassenhierarchie eine Basisimplementierung einiger Methoden in Klasse A und dann wird diese Methode in den Unterklassen A1, A2, ..., A40 überschrieben, wobei jede Unterklasse ihre eigene benutzerdefinierte Implementierung bereitstellt diese Methode. Wenn Sie diese Art von Struktur haben, kann es elegant gehandhabt werden.

void function_in_GUI(){ 
    try { 

    } catch(A a){ 
     SomeInfo someInfo = a.someMethod(); 
     notify_User(someInfo); 
    } 
} 

Die Idee ist, dass Sie nicht nur jede einzelne Ausnahme fangen müssen einige Informationen von einer Ausnahme zu erhalten, die zur Laufzeit auftritt.

+1

gute Antwort. Wenn die Ausnahmebehandlung nur dazu dient, den Benutzer zu benachrichtigen, ist es nicht erforderlich, jede Ausnahme separat abzufangen. Vielleicht ist es sogar nicht erforderlich, eine so große Hierarchie von Ausnahmeklassen zu haben? "Jede Ausnahme trägt eine andere Information", aber wenn diese Information nur für die GUI ist, dann ist vielleicht die allgemeine Struktur (für die GUI-Nachricht) alles, was Sie brauchen? Sie sollten die ursprüngliche Ausnahme immer als Feld beibehalten. So könnte die Ursache protokolliert/debuggt werden. –

Verwandte Themen