2016-04-30 1 views
1

Посмотрите на следующий код:Поймать несколько исключений и бросить новый список исключений

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


Все сеттеры могут бросить ProductException с настраиваемым сообщением. Но я хочу поймать все исключения. Если есть исключения, я хочу отправить список в GUI всех ошибок.

Как это сделать, или мне нужно окружить каждую строку Try Catch?

+0

Если возникает исключение, почему вы хотите продолжить работу по изменению продукта? Если возникает исключение, это указывает на проблему; и «продукт» должен быть оставлен в состоянии, которое было до того, как вы начали его редактировать (* Эффективная Java * относится к этому как к ["failure atomicity"] (http://stackoverflow.com/questions/29842845/what- является безотказной-атомарностью-используется-на-J-Bloch-и-хау его-выгодный в плане-правового я)). –

+0

Привет, я хочу показать пользователю разные ошибки: «Нет описания, - Нет цены - ...» – Demian

+0

Что для вас здесь исключение? Продукт должен быть нулевым? Некоторые параметры метода для Нуль, исключение может возникнуть здесь ... – GOXR3PLUS

ответ

0

Если вам нужны все исключения в списке, вам необходимо окружить каждую строку, попробовав уловить и добавьте исключение в список, а при последней проверке размер списка больше 0, а затем верните этот список как исключение.

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

Спасибо, но не существует лучшее решение для этого? – Demian

+0

, а не исключение исключения из метода setter, вы можете просто добавить метод проверки для обработки всей проверки сеттера и выполнить всю свою операцию там для всех проверок полей. Это будет подход с использованием теста. –

+0

Привет, это возможность. Но я хочу сохранить весь «доменный» код в доменном классе. – Demian

0

Если вы действительно хотите сделать такую ​​вещь, вы могли бы делегировать свойство параметра для метода, который бы поймать запустить установщик как лямбда, а затем поймать возможное исключение, или добавить его в список:

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 можете попробовать следующий код. если это подходит

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

Привет, мне нравится ваше решение! Я не знаю, что это лучшая практика. Немного, если сеттер не работает, счет будет по-прежнему остальным. Таким образом, у вас есть бесконечный цикл. Возможно, вы можете увеличить до переключателя или в группе finally? – Demian

+0

Посмотрите на мой код .. есть счетчик ++ statement.there - инструкция count ++ после переключения и в блоке catch –

+0

Да ... но 'for (count = 1; count <= 6; count ++)' делает то же самое, и он гораздо читабельнее. Кроме того, вы должны поймать 'ProductException'. Улавливание «Исключение» - это плохая идея, потому что это приведет к непредвиденным исключениям, которые будут сообщены пользователю как ошибки проверки. –