Come gestire il passaggio di un oggetto DAO con eccezioni personalizzate in java?

1

Ho il mio progetto Maven multi modulo con la seguente struttura:

+ parent
   - pom.xml

+ model
   - persistents
   - dao
   - model stuff...
   - pom.xml

+ service
   - services
   - services stuff...
   - pom.xml

+ utils
   - exceptions
   - pom.xml

Nel modulo utils ho alcune eccezioni personalizzate. Il punto è che, nelle mie eccezioni, voglio avere la modifica per dare l'oggetto che ha causato l'eccezione, per esempio, supponiamo di avere l'utente della classe persistente. L'utente porta una UserNotFoundException all'utente. Voglio avere i seguenti costruttori:

UserNotFoundException(String message)

UserNotFoundException(String message, User user)

L'idea è di poter avere l'oggetto che ha causato l'eccezione durante la sua gestione. Tuttavia, suona così strano per me lanciare l'oggetto persistente all'interno di un'eccezione ... È corretto? Ha senso lanciare l'oggetto in un'eccezione? (Penso che potrebbe essere utile per vedere come è l'oggetto quando appare l'eccezione).

    
posta CodeSniffer 13.05.2017 - 18:04
fonte

2 risposte

2

La domanda è: cosa puoi fare con quell'oggetto nel punto in cui rilevi l'eccezione?

Tutti i casi che ho visto in natura sono registrati o mostrati all'utente. In tale scenario non è possibile utilizzare l'oggetto reale se non chiamando il metodo toString() . Ancor peggiore: vuoi ottenere qualche altra proprietà da includere nel messaggio in base alla causa principale dell'eccezione? Come lo sai nel blocco catch ? Ma nel luogo in cui viene lanciata l'eccezione, sai molto bene quale proprietà dell'oggetto potrebbe essere di interesse ...

Quindi come al solito la mia risposta è: dipende.

Il fatto che I non possa pensare a qualcosa di utile per fare l'oggetto all'interno del blocco catch non significa che tu non puoi neanche ...

Ma a meno che tu non abbia provato questo bisogno non dovresti costringere qualcun altro a seguire il tuo schema.

    
risposta data 13.05.2017 - 18:20
fonte
0

Hai un difetto molto semplice nell'architettura del tuo software: stai separando il tuo dominio dai confini tecnici - stai tagliando il tuo dominio in due parti. Ciò rende difficile l'interazione tra le due parti. Non farlo.

Mantieni le tue eccezioni vicino a dove vengono lanciate. Un UserNotFoundException è qualcosa di molto specifico per gli utenti: parte del tuo dominio. Ahimè, mettilo nel tuo pacchetto e nel tuo pacchetto users . Un pacchetto di utilità dovrebbe contenere utilità (come suggerisce il nome). Ciò significa che UserException non è di gran lunga la preoccupazione primaria del pacchetto di utilità.

TL; DR Interrompe la creazione di pacchetti tecnici. Separa e raggruppa per dominio, non programmando i costrutti del linguaggio. Poof: i tuoi problemi sono svaniti.

    
risposta data 14.05.2017 - 10:49
fonte

Leggi altre domande sui tag