Node.js und Fehler - wie ich meine Error-Klasse einsetze
In einem vorherigen Artikel habe ich beschrieben, warum und wie ich mir in Node.js eine Base-Error-Klasse erstellt habe. Um den Nutzen zu verdeutlichen, zeige ich dir, wie ich damit arbeite und weshalb ich mir noch zusätzlich eine wichtige Hilfsfunktion geschrieben habe.
Im Artikel „Node.js und meine Base-Error-Klasse“ haben wir die BaseError-Klasse entwickelt. In freier Wildbahn setze ich die Klasse wie folgt ein:
try {
// ... some code
} (e: unknown) {
const error = ensureError(e)
// I can work with the error object here
const detail = error.detail
}
Jeglicher Fehler im Catch ist aus Sicht von TypeScript unbekannt. Es kann eine JavaScript-Standard-Error-Klasse, eine Zeichenkette, eine Zahl, null, ein Promise oder undefined sein. Also eigentlich so ziemlich alles.
Den Code zur Prüfung von unknown habe ich in eine Funktion namens ensureError() ausgelagert. Ziel ist, ein Error-Objekt zur Hand zu haben:
import BaseError from '@/error/base/BaseError'
export default (value: unknown): BaseError => {
if (value instanceof BaseError) {
return value
}
if (value instanceof Error) {
const newError = new BaseError({
detail: value.message,
cause: value.cause,
})
newError.name = value.name
newError.stack = value.stack
return newError
}
let stringified = '[Unable to stringify the thrown value]'
try {
stringified = JSON.stringify(value)
} catch {
/* empty */
}
return new BaseError({ detail: `This value was not thrown as Error, but: ${stringified}`, cause: value })
}
Inspiriert ist der Ansatz von Kent Dodd's Artikel Get a catch block error message with TypeScript.