Как обрабатывать проверенные исключения внутри объекта функтора в Java - PullRequest
4 голосов
/ 15 октября 2010

Мы используем библиотеки http://jedi.codehaus.org для работы с коллекциями и их функционального управления.Недавно мы столкнулись с проблемой, когда выполняли что-то похожее на следующее:

public class Address {
    //constructors and stuff

    public KiloWatts electricityConsumed(Duration timePeriod) throw NoElectricitySupply {
        .... does stuff but can throw checked exception
    } 
}

, учитывая, что у нас есть коллекция адресов, и мы хотели выполнить что-то на UnitsOfElectricity, связанном с каждым адресом, как бы вы справились с брошеннымНапример:

public KiloWatts totalEnergyConsumed(Address... addresses, final Duration timePeriod) {
     List<KiloWatts> energyConsumedPerAddress = FunctionalPrimitives.collect(addresses, new Functor<Address, KiloWatts>{
         public KiloWatts execute(Address address){
              try {
                  return address.energyConsumed(timePeriod);
              } catch (NoElectricitySupply e) {

                  //What do you do here?

              }
         }
     });
}

Как бы вы обработали исключение?

Ответы [ 3 ]

3 голосов
/ 15 октября 2010

Насколько я могу судить, у вас есть 2 варианта:

  1. генерировать исключение времени выполнения (и игнорировать его); или
  2. выдает исключение времени выполнения, используя его для «маршалинга» проверенного исключения за границу интерфейса.

для (2), что-то вроде:

public KiloWatts totalEnergyConsumed(Address... addresses, final Duration timePeriod) {
    try {
        List<KiloWatts> energyConsumedPerAddress = FunctionalPrimitives.collect(addresses, new Functor<Address, KiloWatts>{
            public KiloWatts execute(Address address){
                try {
                    return address.energyConsumed(timePeriod);
                } catch (NoElectricitySupply e) {
                    throw new RuntimeException("internal marshalling exception", e);
                }
           }
       });
    } catch(RuntimeException re) {
        throw e.getCause();
    }
}
1 голос
/ 27 марта 2011

почему бы не вернуть Option из функтора, чтобы вы могли вернуть None для исключительного случая?Затем вы можете сгладить списокв список (для этого есть метод FunctionalPrimitives).

В качестве альтернативы, если у вас есть контроль над методом energyConsumed, который выдает исключение, замените выброшенное исключение на тип возврата либо (строка может содержать сообщение об ошибке или что-то в этом роде - мне нужно узнать больше, чтобы понять, что там делать).

Использование Either вместо исключений включает композицию, исключения полностью нарушают композицию.

1 голос
/ 15 октября 2010

Если NoElectricitySupply логически эквивалентно нулю KiloWatts, разве вы не должны просто возвращать такой объект?

Если они не совсем эквивалентны, вы можете создать какой-то особый подкласс NoKiloWattsи вернуть экземпляр такого в блоке catch.

...