En general, utilizo excepciones cuando la excepción debe causar un proceso para abortar. Cuando haga algo sobre el problema y me recupere de alguna manera, trato de evitar que la excepción ocurra.
Me gusta, si se pasa un parámetro a una subrutina y espero razonablemente que sea nulo, lo verificaré nulo. En la vida real, por ejemplo, una Cadena nula a menudo es equivalente a una Cadena de longitud cero, en la que solo escribiré < si (s == nulo) s = ""; >.
Pero si una Cadena nula significa que algo salió mal y deberíamos abandonar todo el proceso y mostrar un tipo de mensaje "Pánico - Abortar - El mundo termina pronto" para el usuario, entonces una excepción es muy práctico. Puede arrojar la excepción hacia lo más profundo de muchas capas de subrutinas, y simplemente atraparla en la parte superior, mostrar el mensaje, y listo.
A menudo creo mis propias excepciones para tales condiciones. Muchos de mis programas están salpicados con código como < lanzan una nueva BadInputException ("Número de cliente no encontrado")> para que salga, muestre un mensaje y salga. Esto realmente ahorra en el anidamiento profundo de los IF y la comprobación constante de los valores de retorno de las subrutinas.
Tan cierto. El recuento de errores en el mundo se reduciría significativamente si Java y C# tuvieran tipos de referencia no anulables. – erikkallen