2015-06-28 2 views
2

Я столкнулся с небольшой проблемой, пока я делал простой API для внутреннего кода регистрации и входа на веб-сайт с устройством FIDO.Обертка исключения при обертке сторонней библиотеки

Я в основном обертываю библиотеку yubico u2f и делаю ее еще более простой в использовании. Проблема, с которой я столкнулась, связана с исключениями, я хочу выбросить из моего API на серверный сервер com.yubico.u2f.exceptions.NoEligableDevicesException, но я не хочу, чтобы мой пользователь (разработчик backend) когда-либо видел или импортировал библиотеку yubico.

Поэтому мое решение было обернуть это исключение следующим образом:

package com.github.dkanellis.fikey.exceptions; 

import com.yubico.u2f.data.DeviceRegistration; 

public class NoEligableDevicesException extends com.yubico.u2f.exceptions.NoEligableDevicesException { 
    public NoEligableDevicesException(Iterable<? extends DeviceRegistration> devices, String message, Throwable cause) { 
     super(devices, message, cause); 
    } 

    public NoEligableDevicesException(Iterable<? extends DeviceRegistration> devices, String message) { 
     super(devices, message); 
    } 
} 

, а затем throw пользователь моего исключения, оборачивает исключение Yubico. Проблема в том, что это добавляет сложности к моему коду и каждый раз, когда возникает исключение com.yubico.u2f.exceptions.NoEligableDevicesException, я должен его поймать и выбросить com.github.dkanellis.fikey.exceptions.NoEligableDevicesException.

Есть ли лучший способ сделать это?

+0

Не то, чтобы я мог видеть. (Обратите внимание: использование 'com.github' в качестве базового пакета, вероятно, не является хорошей идеей, если вы на самом деле не работаете в GitHub.) –

+0

@RedRoboHood Я помню, как люди говорили, чтобы сделать это, если у вас нет веб-сайта (потому что в основном по профилю github - мой сайт). Есть ли еще другие соглашения для людей без веб-сайтов? –

+0

Без просмотра вашего кода и уровня абстракции трудно сказать. Вам следует использовать внутренние методы, которые уже завершают исключение. Затем вы уменьшаете места. Это не сработает, если вы обернете API 1: 1 (но вы заявили, что не используете). – eckes

ответ

1

Проблема заключается в том, что это усложняет мой код и каждый раз, когда исключение com.yubico.u2f.exceptions.NoEligableDevicesException происходит у меня есть, чтобы поймать его и бросить com.github.dkanellis.fikey.exceptions.NoEligableDevicesException.

Это не проблема. На самом деле это рекомендуемый способ распространения Exception между различными уровнями приложения. Я встретил this отличную статью о распространении Exception в последнее время. (Это статья .Net, но по-прежнему применима для Java)

Обтекание фактическим Exception в вашем собственном подклассе Exception дает вам гибкость в изменении базовых зависимостей вашего API без нарушения кода клиента. Код клиента по-прежнему зависит от вашего подкласса Exception.

+1

Это было замечательно. –

+0

@AkiK Взгляните на аспектно-ориентированную программу. Возможно, вам будет полезно использовать AOP, который позаботится об обертывании и выбрасывает исключение по вашему выбору, не делая его вручную в каждом методе. Я бы добавил это как часть моего ответа, но это не то, что я пробовал, поэтому не могу быть уверен, что он работает. – CKing

+0

Поскольку на данный момент вхождения в оболочку исключаются из моего небольшого кода, я, вероятно, буду держать вещи простыми и обернуть их сам, но в будущем, где я, вероятно, столкнусь с этим больше, я буду использовать AOP, это текущий код, где я просто есть несколько случаев этого события https://goo.gl/45dfHa –

Смежные вопросы