Dipende interamente da ciò che viene fatto.
Innanzitutto, qual è il comportamento effettivo che desideri? Se qualcuno inserisce le proprie informazioni, allora un rifiuto e una finestra di dialogo che dice, in sostanza, "Non puoi farlo" è probabilmente corretto. Se si tratta di una persona di inserimento dati, che lavora da una pila di moduli, una finestra di dialogo è probabilmente anche buona, e la persona di inserimento dati può inserire i moduli non validi in una pila speciale. Se stai eseguendo l'elaborazione in batch, non vuoi fermarti, ma contrassegnalo e passa a quello successivo.
Una volta che hai il comportamento, devi decidere come implementarlo. Avere un controllo delle regole di business che genera un'eccezione è probabilmente una buona idea. Restituire un codice di ritorno e averlo trasmesso è un'altra cosa che può andare storta, e certamente non vuoi che le voci errate si aggravino.
Non preoccuparti delle spese di performance. Nel caso di un individuo che immette dati, è banale rispetto alle altre volte coinvolte. In genere, l'umano impiegherà più tempo in quel sistema. Nel caso di un lavoro batch, se le eccezioni sono un problema di prestazioni, si inseriscono troppi record errati e nella gestione della realtà e il reinserimento di tutti questi sarà più un problema delle eccezioni.