Uso apropiado de errores

155

Estoy usando TypeScript para un proyecto razonablemente grande, y me pregunto cuál es el estándar para el uso de Errors. Por ejemplo, supongamos que entrego una excepción de índice fuera de límites en Java:

throw new IndexOutOfBoundsException();

¿Sería la declaración equivalente en TypeScript:

throw new Error("Index Out of Bounds");

¿De qué otras maneras podría lograr esto? ¿Cuál es el estándar aceptado?

Nathan Bellowe
fuente

Respuestas:

167

Alguien publicó este enlace en el MDN en un comentario, y creo que fue muy útil . Describe cosas como ErrorTypes muy a fondo.

EvalError --- Crea una instancia que representa un error que ocurre con respecto a la función global eval ().

InternalError --- Crea una instancia que representa un error que ocurre cuando se produce un error interno en el motor de JavaScript. Por ejemplo, "demasiada recursión".

RangeError --- Crea una instancia que representa un error que ocurre cuando una variable numérica o parámetro está fuera de su rango válido.

ReferenceError --- Crea una instancia que representa un error que ocurre al desreferenciar una referencia no válida.

SyntaxError --- Crea una instancia que representa un error de sintaxis que se produce al analizar el código en eval ().

TypeError --- Crea una instancia que representa un error que ocurre cuando una variable o parámetro no es de un tipo válido.

URIError --- Crea una instancia que representa un error que ocurre cuando encodeURI () o decodeURI () pasan parámetros no válidos.

Nathan Bellowe
fuente
Parece faltar un tipo más general de argumento inválido . No todos los argumentos inválidos caen bajo RangeError. ¿Debería definir tipos personalizados o simplemente throw new Error("<message>");?
anddero
58

Se utiliza la convención para fuera de rango en JavaScript RangeError. Para verificar el tipo, use if / else + instanceofcomenzando por el más específico al más genérico

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}
basarat
fuente
2
¿Qué pasa con un error general? ¿Y / o dónde está la lista de clases de error JS incorporadas?
pitosalas
77
Hay una lista de tipos de error de JavaScript y otra información en Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Christian Davén
66
@basarat, creo que deberías agregarlo else { throw; }aquí
knocte
44

Solución simple para emitir y mostrar mensajes por Excepción.

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

Precaución

Lo anterior no es una solución si no sabemos qué tipo de error puede emitirse desde el bloque. En tales casos, se deben usar protectores de tipo y se debe realizar un manejo adecuado para el error adecuado: eche un vistazo a la respuesta @Moriarty.

Maciej Sikora
fuente
Gracias por el puntero a la conversión de tipos explícita. No encontré esa información en el Documentscript-Docs y aprendí algo hoy.
JackLeEmmerdeur
¿Sabes cuál es el propósito de agregar <Error>? e.message funciona bien para mí.
sbattou
1
@sbattou el único propósito <Error>es decirle al compilador de TS que eaquí es de tipo <Error>para que tenga (1) intellisense y (2) una mejor verificación de tipo. Sin embargo, tenga en cuenta que cualquier molde no se traduce en JS en absoluto y es azúcar puramente sintáctico.
Didii
25

No te olvides de las declaraciones de cambio:

  • Asegure el manejo con default.
  • instanceof puede coincidir en superclase.
  • ES6 constructorcoincidirá en la clase exacta.
  • Más fácil de leer.

function handleError() {
    try {
        throw new RangeError();
    }
    catch (e) {
        switch (e.constructor) {
            case Error:      return console.log('generic');
            case RangeError: return console.log('range');
            default:         return console.log('unknown');
        }
    }
}

handleError();

Moriarty
fuente
3
Esto es genial; parece más robusto y limpio que las otras respuestas.
Victor Zamanian