RENUNCIA DE MAYOR: No considero que hay una respuesta "correcta" a esta. Las opiniones expresadas aquí son subjetivas y personales. Lo que es más es que las ideas que estoy a punto de abrazar solo son útiles si vas a hacer cosas diferentes con diferentes, ejem, fallas ... como si usaras un sistema según la respuesta informativa de Daniel Earwicker. Con eso en mente:
Yo sostengo que "una EXCEPCIÓN es excepcional". Un ERROR es menos inesperado.
renuncia: El siguiente pseudo-código no es bueno; simplemente sirve como el caso mínimo en que podría pensar para ilustrar mi punto.
nota: en este experimento, GetFile devuelve UNDEFINED si no puede encontrar el archivo especificado.
function AlwaysGetFile(name){
var file = null;
if(FileExists(name)){
file = GetFile(name);
if(typeof file === "undefined"){
throw new "couldn't retrieve file" EXCEPTION
}
}
else{
throw new "file does not exist" ERROR
}
return file;
}
En el caso de que un consumidor llama GetFileOrThrow con un nombre de archivo que no existe, se producirá un error. En mi opinión, la distinción es que el código de nivel superior (o la entrada del usuario) está haciendo algo mal ... esta función debe pasar un ERROR en la línea hacia ese código de nivel superior que puede decidir qué hacer con este resultado. Considerarlo como esto ... esta función estaría diciendo a cualquiera de las funciones que consumen:
Look, my friend, I know what's going on here: it is an ERROR to request BobAccounts.xml, so don't do it again! Oh, and if you think you now know what might have gone wrong (having abused me), go ahead and try to recover from it!
Consideremos ahora el caso de que esta función toma el nombre, comprueba que el archivo existe y luego por alguna razón no puede recuperarlo. Esta es una situación diferente. Algo realmente inesperado ha sucedido. Además, el código de consumo no es culpa de. Ahora queremos realmente esta función para decir a cualquiera de las funciones que consumen:
Oh fiddlesticks! Sorry about this, I humbly beg your pardon but something EXCEPTIONAL that I don't really understand has gone wrong. I don't think that your request for BobAccounts.xml was unreasonable... and I know I should be fulfilling it for you. Since I'm lower level code than you, I really ought to know what's going on... but I don't... and since you've less chance than me of understanding this EXCEPTIONAL situation, I think you'd probably best just stop what you're doing and let this message go all the way to the top... I mean, there is something seriously fishy going on here.
así que supongo que mi resumen es el siguiente: si el error ocurrió en una mayor código de pedido (que se aprobaron los datos erróneos) generará un error. Si el error ocurrió en un código de orden inferior (una función de la que dependía falló de una manera que no entendió y no pudo planear) lanzar una EXCEPCIÓN ... y si el error ocurrió en la función que está escribiendo actualmente. Bueno, duh, si eres consciente de eso, ¡arréglalo!
Y, finalmente, para responder la pregunta original más directamente: en términos de manejo de ERRORES y EXCEPCIONES, mi consejo sería: manejar todos los ERRORES con gracia (opcionalmente registrándolos) ... pero manejar EXCEPCIONES con cuidado; solo trate de recuperarse de una EXCEPCIÓN si está realmente seguro de que sabe qué es y por qué sucedió; de lo contrario, permita que suba (vuelva a lanzarlo si es necesario).
Siempre me he referido a esto como "manejo de excepciones", sin embargo, para activar un bloque catch 'tiras nuevo Error ("...')', entonces ... – Josh
Bueno, puedes lanzar lo que quieras - 'throw "¡Hola mamá!", "Es perfectamente válido". – Pointy
Sí. Tal vez debería decir * I * lanzar nuevos objetos de Error u objetos que hereden de Error. – Josh