bit_rainbow
@bit_rainbow

Как Вы обрабатываете ошибки в своих ресурсах?

Вот типичный код ресурса (JAR-RS) в проекте:

@Path("authenticate")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response authenticate(Credentials credentials) {
  try{
     // some logic
  } catch (Exception1 e) { 
            //   etc  LOGGER.error(e);
            //   return Response.status(Status.UN_AUTHORIZED).build();
   } catch (Exception2 e) { 
            //   etc  LOGGER.error(e);
            //   return Response.status(Status.CAN_NOT_CREATE_TOKEN).build();
   }  catch (Exception3 e) { 
         //   etc  LOGGER.error(e);
         //   return Response.status(Status.SOME_OTHER_ERROR).build();
   }

  
  // return good stuff
}


Код рабочий, но не красивый. Погуглил как сократить количество catch без ущерба - не нашел, порылся в книге по ресту, тоже не нашел. Может кто уже сталикивался с таким может поделиться опытом? Хочу уменшить количество catch без ущерба, потому что в не которых местах есть по 10 catch'ей.

Более менее полезная находка
  • Вопрос задан
  • 2436 просмотров
Пригласить эксперта
Ответы на вопрос 5
@onepavel
Консультация и разработка мобильных приложений
1. Ловить ошибку надо в том случае, если вы ее можете обработать. Иначе выкидывайте из метода
2. В java 7 catch можно объединять catch(NullPointerException | ClassNotFindException)
3. Берите базовый класс ошибки, чтобы ловить все catch(Exception)
Такое кол-во catch нормально, особенно когда с http работают.
Ответ написан
Комментировать
DigitalSmile
@DigitalSmile
http://brainstorage.me/digitalsmile
Если используете Jersey, то можно вот так https://jersey.java.net/documentation/latest/repre...
Если нет, советую попробовать :)
Ответ написан
Комментировать
@lslayer
Программист и сисадмин
В именно этом случае я бы сделал какой-то вспомогательный класс, который возвращает нужный статус в зависимости от класса ошибки.
Например
public static Status getStatus(Exception e) {
        if (e.getClass.equals(MyCoolUnautorisedException.class)) {
           return Status.UN_AUTHORIZED;
        }
        // More Exception handlers
     return null; //If something gone wrong
     }
  //Main code
    try {
       // some logic
    } catch (Exception e) { 
              //   etc  LOGGER.error(e);
              return Response.status(SomeStatusHandler.getStatus(e)).build();
    } finally {
        //Here we go!
    }
Ответ написан
zo0m
@zo0m
full stack developer
Еще "экзотический" вариант, можно сделать мапу
Exception => Status
ну или более дженерик, типа Exception => Handler
и все кетчи свернуть в простой вызов мапы. Как-то так.

С мапой удобно если у вас много типичных хендлеров.
Ответ написан
Комментировать
targetjump
@targetjump
Большинство рест фреймворков предоставляют возможность писать кастомные ExceptionMapper-ы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы