Dipende tutto dall'importanza di non rovinare le cose quando qualcuno commette un errore o quando SNAFU succede. Presumo che sia importante.
Ad esempio, fornisci un esempio in foo:
throw new exception("Method should not be called if D==F, you forgot how to use this method");
Supponendo che foo non imposti D e F, e il programmatore lo fa, e ovviamente che foo non dovrebbe gestire la situazione in cui D e F sono uguali, è probabilmente la scelta giusta per lanciare un errore. I programmatori sono degli idioti, specialmente quello che usa il tuo codice successivo.
Per verificare che qualcosa abbia avuto successo, non è una cattiva idea se sei in grado di identificare possibili punti di errore. Ad esempio, supponendo un grabber HTTP che restituisce una tupla (integer flag, data object) per qualsiasi motivo:
(flag, page_data) = http_fetch(bleh);
if (flag not in ACCEPTABLE_FLAGS) {
throw new exception("Today is not a good day.");
}
file_thing.write(page_data.bytes);
Qui, il controllo degli errori significa che nessuno abbatte la tua porta perché Internet è andato giù e di conseguenza il tuo codice ha scalzato i database con spazzatura casuale.
Se è il tuo lavoro, ad es. che hai scritto http_fetch sopra, fai comunque le dichiarazioni. A meno che tu non sia in un ambiente di lavoro davvero terribile e terribile, le persone dovrebbero apprezzare che stai solo riconoscendo che a volte accade lo scenario peggiore.
D'altra parte, è probabilmente eccessivo fare quanto segue:
mid = (low + high)/2;
assert((low <= mid) && (mid <= high));
In breve, se è possibile identificare un punto di errore, coprirlo. Anche se è il tuo codice, a volte le cose vanno male e le supposizioni che hai fatto durante la scrittura di quel codice - come ad esempio che il chiamante avrebbe effettivamente letto i documenti - non sono corrette.