2016-04-30 9 views
1

Blick auf dem folgenden Code:Fang mehr Ausnahmen und werfen eine neue Liste von Ausnahmen

public void editProduct(String articleNumber, ...) { 
product.setArticleNumber(articleNumber); 
product.setDescription(description); 
product.setLendable(lendable); 
product.setName(name); 
product.setPrice(price); 
product.setPlace(place); 
} 


Alle der Einrichter eine ProductException mit einer benutzerdefinierten Nachricht werfen. Aber ich möchte alle Ausnahmen fangen. Wenn es Ausnahmen gibt, möchte ich eine Liste aller Fehler an die GUI senden.

Wie kann ich das tun, oder muss ich jede Zeile mit einem Try Catch umgeben?

+0

Wenn eine Ausnahme auftritt, warum möchten Sie fortfahren, das Produkt zu ändern? Wenn eine Ausnahme auftritt, weist dies auf ein Problem hin. und das 'Produkt' sollte in dem Zustand belassen werden, in dem es war, bevor du anfingst, es zu bearbeiten (* Effektives Java * bezieht sich darauf als [" Fehleratomizität "]) (http://stackoverflow.com/questions/29842845/what- is-default-atomicity-used-by-j-bloch-und-wie-es-vorteilhaft-in-terms-of-i)). –

+0

Hallo, ich möchte den Benutzer die verschiedenen Fehler zeigen: '- Es gibt keine Beschreibung, - Es gibt keinen Preis - ...' – Demian

+0

Was ist eine Ausnahme für Sie hier? Das Produkt zu null? Einige der Methodenparameter zu Diese Methoden sind einfache Setter? Wie die Ausnahme hier auftreten kann ... – GOXR3PLUS

Antwort

0

Wenn Sie alle Ausnahmen in der Liste benötigen, dann müssen Sie jede Zeile umschließen, indem Sie fangen und fügen die Ausnahme in einer Liste und in der letzten Überprüfung die Größe der Liste größer als 0 dann diese Liste als Ausnahme zurückgeben.

List<CustomException> exceptionList = new ArrayList<CustomException>(); 
public void editProduct(String articleNumber, ...) 
{ 
    try{ 
      product.setArticleNumber(articleNumber); 
    }catch(CustomException exception) 
    { 
     exceptionList.add(exception); 
     } 
     try{ 
     product.setDescription(description); 
     }catch(CustomException exception) 
    { 
     exceptionList.add(exception); 
     } 
    try{ 
    product.setLendable(lendable); 
    }catch(CustomException exception) 
    { 
     exceptionList.add(exception); 
     } 
    try{ 
      product.setName(name); 
    }catch(CustomException exception) 
    { 
     exceptionList.add(exception); 
     } 
     try{ 
     product.setPrice(price); 
    }catch(CustomException exception) 
    { 
     exceptionList.add(exception); 
     } 
    try{ 
     product.setPlace(place); 
    }catch(CustomException exception) 
    { 
     exceptionList.add(exception); 
     } 
} 
+0

Vielen Dank, aber gibt es nicht eine bessere Lösung dafür? – Demian

+0

Anstatt eine Ausnahme von der Setter-Methode zu werfen, können Sie einfach eine Validierungsmethode für die Behandlung Ihrer All-Setter-Prüfung hinzufügen und dort alle Ihre Operationen für alle Felder validations.that take approach durchführen. –

+0

Hallo, das ist eine Möglichkeit. Aber ich möchte den ganzen "Domain" -Code in der Domain-Klasse behalten. – Demian

0

Wenn Sie wirklich, so etwas tun möchten, können Sie die Eigenschaft delegieren ein Verfahren einstellen, die die Setter als Lambda laufen fangen würde, dann fangen die mögliche Ausnahme, oder fügen Sie ihn in einer Liste:

class C { 
    @FunctionalInterface 
    private static interface TaskMayThrow { 
     void run() throws CustomException; 
    } 

    private static boolean runTask(TaskMayThrow task, List<CustomException> errList) { 
     try { 
      task.run(); 
      return true; 
     } catch(CustomException e) { 
      errList.add(e); 
      return false; 
     } 
    } 

    List<CustomException> exceptionList = new ArrayList<CustomException>(); 
    public void editProduct(String articleNumber, ...) 
    { 
     runTask(() -> product.setArticleNumber(articleNumber), exceptionList); 
     runTask(() -> product.setDescription(description), exceptionList); 
     // The same for all other setters 
     // Do whatever you want with the error list 
    } 
1

Yo kann den folgenden Code versuchen. Wenn es geeignet ist

public void editProduct(String articleNumber, ...) { 
    int count=1; 
    Vector<String> v=new Vector<String>(); 
    while(count<=6) 
    { 
     try{ 

      switch(count) 
      { 
       case 1:product.setArticleNumber(articleNumber);break;//assume it will throw ArticalException 
       case 2:product.setDescription(description);break; //DescriptionException 
       case 3:product.setLendable(lendable);break;   //LendableException 
       case 4:product.setName(name);break;     //NameException 
       case 5:product.setPrice(price);break;    //PriceException 
       case 6:product.setPlace(place);break;    //PlaceException 
      } 
      count++; 
     }catch(Exception e) 
     { 
      v.add(e.getMessage); 
      count++; 
      /* 
      *suppose there is some exception like ArticalException,PriceException 
      *then it will store in vector and your program running continue 
      *and at last you have the list of all exceptions that are occured in program 
      *now you will take desired action what you want to do 
      **/ 
     } 
    } 

} 
+0

Hallo, ich mag deine Lösung! Ich weiß nicht, es ist die beste Praxis Eine kleine Sache, wenn ein Setter fehlschlägt, wird die Zählung immer noch die gleiche sein. Du hast also eine Endlosschleife. Vielleicht können Sie vor dem Schalter oder in der Endgruppe erhöhen? – Demian

+0

schauen Sie sich meinen Code an .. Es gibt eine count ++ Anweisung. Es gibt eine count ++ Anweisung nach switch und in catch block –

+0

Ja ... aber 'for (count = 1; count <= 6; count ++)' macht das Gleiche, und es ist viel lesbarer. Außerdem sollten Sie 'ProductException' abfangen. Das Abfangen von "Exception" ist eine schlechte Idee, da es dazu führt, dass unerwartete Ausnahmen als Validierungsfehler an den Benutzer gemeldet werden. –