2016-05-14 5 views
0

Ich möchte eine gemeinsam genutzte Bibliothek die Ausnahmen von innerhalb umbrechen und es als eine anwendungsspezifische Ausnahme für diejenigen, die nicht mit ihnen umgehen können.Ist es in Ordnung, eine anwendungsspezifische Ausnahme aus einer benutzerdefinierten gemeinsam genutzten Bibliothek zu werfen?

Was ich zur Zeit habe, ist eine Bibliotheksausnahme mit einer statischen Methode, die die anwendungsspezifische Ausnahmeklasse einrichtet, die ich über Reflektion instanziiere, falls eine Ausnahme ausgelöst wird.

Mein Ziel ist es, eine einzelne App spezifische Ausnahme, die durch einen gemeinsamen Code würdevoll behandelt werden können.

Gibt es einen besseren Weg, dies zu tun?

lib.LibExUtil.java

class LibExUtil { 
    static Class<? extends RuntimeException> ex = RuntimeException.class; 
    public static setAppEx(Class<? extends RuntimeException> ex) { 
    this.ex = ex; 
    } 
    static RuntimeException wrap(Throwable t) { 
    return (RuntimeException)ex 
     .getDeclaredConstructor(new Class[] {Throwable.class}).newInstance(new Object[] {t}) 
    } 
} 

lib.SomeUtil.java

static void utilMethod() { 
    try { 
    // code with checked exception 
    } catch (Exception ex) { 
    throw LibExUtil.wrap(ex); 
    } 
} 

myApp.MyAppEx.java

public class MyAppEx extends RuntimeException { 
    MyAppEx(Throwable t) {super(t);} 
} 

myApp.Client.java

// initialization 
LibExUtil.setAppEx(myApp.MyAppEx.class); // optional 

void method() { 
    SomeUtil.utilMethod(); 
} 

Antwort

0

Für Wartbarkeit möchten Sie in der Regel App-spezifische Funktionalität in einer gemeinsam genutzten Bibliothek vermeiden.

Es wäre sinnvoller, eine bibliotheksspezifische Ausnahme auszulösen und sie auf der App-Ebene zu verpacken, wenn dies Ihr Anwendungsfall ist.

Bibliothek Ausnahme:

public class LibraryException extends Exception { 
    LibraryException(Throwable t) {super(t);} 
} 

lib.SomeUtil.java

static void utilMethod() { 
    try { 
    // code with checked exception 
    } catch (Exception ex) { 
    throw new LibraryException(ex); 
    } 
} 

myApp.Client.java

void method() { 
    try{ 
    SomeUtil.utilMethod(); 
    } catch (LibraryException e) { 
    throw new MyAppEx(e); 
    } 
} 
+0

Nur hinzufügen, diese Methode ermöglicht alles, was Ihre gemeinsam genutzte Bibliothek verwendet, um die Ausnahme in einer für diese Komponente geeigneten Weise zu behandeln. Später möchten Sie vielleicht, dass eine Komponente eine RuntimeException für den Fehler von utilMethod() auslöst, eine andere die Exception behandelt und weitergeht, dann eine andere, um die LibraryException einfach auf eine höhere Komponente zu werfen. Je detaillierter Ihre Ausnahmebehandlung ist, desto einfacher ist es, ein Problem zu beheben, wenn Ihr Projekt größer wird. –

+0

App-spezifische Funktionalität kann nicht in einer gemeinsam genutzten Bibliothek sein, aber sind Laufzeitwerte enthalten? Was ist, wenn die gemeinsam genutzte Bibliothek niemals mit mehreren Apps im selben jvm ausgeführt wird? Ich wollte die Client-Anrufe sauberer machen, indem ich nicht direkt mit der geprüften util-Ausnahme umgehen musste. Ich werde die Frage in Kürze mit Details aktualisieren. –

+0

Ich versuche, den Bloat mit dem try-catch-Block zu vermeiden, util-Aufrufe sind normalerweise One-Liner. –

0

In Ihrem Beispiel Ihrer Bibliothek Methode SomeUtil.utilMethod(); hat etwas Arbeit geleistet und zu einer Ausnahme geführt. Es wäre besser, wenn die util -Methode durch eine von der Bibliothek definierte Ausnahme den Benutzer darauf aufmerksam macht, was damit falsch gelaufen ist. Ein weiteres Problem ist im Fall von Multi-Projekt-Setup wie Maven, wenn ein Modul eine andere Ausnahme als andere Modul zu werfen möchte und der Entwickler vergisst, statische Methode aufzurufen, dann wird Ihre Bibliotheksmethode einige irreführende Ausnahme werfen. Vermeiden Sie dieses Muster.

+0

Es alarmiert die App mit der 'app ex' oder möglicherweise' lib defined exception' mit dem Original ex im Inneren verpackt. Hätte nicht jedes Projekt im Multiprojekt-Setup eine eigene jvm-Instanz? Verzeihen Sie meine Unwissenheit, aber die Multi-Projekt-Module, die ich kenne, wie in Java ee Beispielen, werden separat ausgeführt. –

+0

Nun, ich meine, wenn Sie ein Maven wie Projekt haben, wo Sie mehrere Module haben, wo mehrere Module Ihre Bibliotheksmethode verwenden, aber möglicherweise unterschiedliche Ausnahmen basierend auf ihren Anforderungen auslösen möchten. Für z.B. Modul A: möchte eine ModuleAException auslösen, Modul B: möchte ModuleBException auslösen, und beide sind Teil der gleichen Anwendung, die unter derselben JVM ausgeführt wird. –

Verwandte Themen