Ci sono molte risposte basate sull'opinione, ma c'è una risposta su cui tutti dovrebbero assolutamente essere d'accordo:
If your library throws an exception, the user must catch it to handle it. Thus, the user's opinion about how you should throw exceptions is the right one.
Se ci si aspetta che il tuo utente approfondisca la tua implementazione ogni volta che si verifica un'eccezione per capire cosa è andato storto e per gestirlo, devi lanciare l'eccezione originale. Ora di solito questa è una supposizione sciocca. La maggior parte degli utenti non ha nemmeno il codice sorgente nelle loro librerie, tanto meno sapere come eseguirne il debug, ma il tuo programma potrebbe essere diverso. Se i tuoi utenti hanno una buona ragione per approfondire la tua biblioteca, l'involucro delle eccezioni potrebbe semplicemente mettersi in mezzo. Detto questo, è generalmente una cattiva forma per costringere l'utente ad essere a conoscenza dei dettagli di implementazione della libreria. Immagina se avessero una gestione delle eccezioni per un errore che potresti fare con un elenco, solo per scoprire che hai rifattorizzato la libreria per utilizzare gli array.
Potrebbe sorgere un altro caso se le eccezioni sono davvero degli errori: eccezioni che non sono mai destinate a essere gestite. Sono destinati ad abortire l'applicazione. Forse la tua eccezione nell'algoritmo che usa la lista mette la tua biblioteca in uno stato incoerente che non potrà mai più essere usato. Chiamerei quel design scadente, ma ci sono un sacco di motivi non di codice per creare strani prodotti nel mondo reale.
Personalmente, preferisco trattare l'eccezione come ultima conversazione tra i fossi con il mio utente. È dove la mia biblioteca non è riuscita a soddisfare le sue aspettative, e devo ammettere che le cose saranno difficili. In tal caso, provo a ripulire il più possibile (provo a riportare il sistema in uno stato coerente), quindi a generare un'eccezione personalizzata che è possibile provare a recuperare e recuperare. Se c'è la possibilità che i tuoi utenti vogliano approfondire la tua libreria, assicurati di fornire loro InnerException per conservare la traccia dello stack e le informazioni sulle eccezioni di cui hanno bisogno per farlo.
Ma in tutti i casi, l'opinione dell'utente è fondamentale. Crea un prodotto che gli utenti vorranno utilizzare, e il resto può sempre essere risolto in seguito. Crea un prodotto perfetto che gli utenti non utilizzeranno e non importa in che modo hai seguito le best practice.