Como devo lidar com entrada de usuário inválida?

Estou pensando nesse problema há algum tempo e gostaria de ter opiniões de outros desenvolvedores. Eu costumo ter um estilo de programação muito defensivo. Meu bloco ou método típico é assim: T foo(par1, par2, par3, ...) { // Check that all parameters are correct, return undefined (null) // or...