Dipende dal significato / contesto dell'eccezione.
Ad esempio, il progetto corrente su cui sto lavorando utilizza una classe BusinessException
. Questo è usato per ogni eccezione esplicitamente generata con un messaggio (in più livelli oltre al BLL - Sono consapevole che il nome è fuorviante). Il BusinessException
risiede quindi nel livello del dominio (= dove IMyService
si trova).
Per coloro che sono interessati, il motivo principale per usare BusinessException
è che permettiamo che questi messaggi di eccezione vengano restituiti al consumatore della nostra API Web, mentre tutte le altre eccezioni vengono riformulate in "si è verificato un errore".
Una delle nostre classi di business logic ha un UserIsInactiveException
particolare. Questa particolare eccezione viene utilizzata solo come regola di business logic particolare (agli utenti non attivi non è consentito aggiornare i dati). Pertanto, sappiamo intrinsecamente che verrà utilizzato solo sul livello della logica di business e quindi risiede nel progetto BLL (= dove si trova MyService
).
UserIsInactiveException
eredita da BusinessException
. Ma la posizione delle eccezioni sarebbe la stessa indipendentemente dal fatto che abbiano un'eredità o meno.
My own thoughts on this are that the exception should probably live with the implementation, as the exception is most likely an implementation detail.
Quello che dici non è errato, ma non è nemmeno universalmente applicabile. Alcune eccezioni fanno parte del framework più di quanto non siano un dettaglio di implementazione, ad esempio quando si prevede che il framework gestisca alcune eccezioni (personalizzate) in modo diverso.