Error Handling in JavaScript

Sa presupunem urmatorul scenariu, pe server avem un serviciu de news.

import news from "server/services/news"

await news.update({ title: "...", content: "..." })

Pt. urmatoarea functionalitate, voi cum ati face error handling?

async function update(record) {
	const schema = schemas.get(record.type)

	if (!schema) {
		// operational error: user can type an invalid record type
	}

	const errors = schema.validate(record)

	if (errors) {
		// operational error: user data is not schema valid
		// need to propagate errors to client
	}

	// operational error: record.email must be unique
	// programmer error: invalid table name
	await table.update({ id: record.id }, record)
}

Totul într un try catch și dacă !schema atunci arunci o eroare custom.

1 Like

Odata ar fi un split intre eroare care se va returna la client si ce se salveaza pe server in loguri pentru o analiza ulterioara.

  1. Client
    Functie de cat de detaliat se vrea:
    a. O eroare generica cu un try catch global, fara mai multe informatii.
    b. HTTP 400 pentru probleme de request de la client cu un payload de error code si error message, 500 pentru problemele la salvare in storage.

  2. Server
    Informatii despre request, client/sesiune, environment, …

Am facut update la postul initial sa fie clar in ce context ma intereseaza.

Momentan am implementat un custom error Failed care extinde Error:

async function update(record) {
	const schema = schemas.get(record.type)

	if (!schema) {
		throw new Failed({
			type: "SCHEMA_TYPE",
			message: `Invalid schema type: ${record.type}`,
		})
	}

	const errors = schema.validate(record)

	if (errors) {
		throw new Failed({
			type: "SCHEMA_VALIDATION",
			message: `Schema validation failed (${record.type})`,
			cause: errors
		})
	}

	try {
		await table.update({ id: record.id }, record)
	} catch (error) {
		if (error.code === "SQLITE_CONSTRAINT_UNIQUE") {
			throw new Failed({
				type: "STORAGE_UNIQUE",
				message: `Storage unique constraint failed`,
				cause: error
			})
		}
		
		throw error
	}
}