JavaScript/TypeScript: Štandardný spôsob, ako uchovať príčinu chyby


Mám skúsenosti ako Java developer a s JavaScriptom/TypeScriptom som celkom nový.

Existuje štandardný spôsob, ako spravovať a uchovávať príčinu chyby v JavaScripte/TypeScripte?

Môj cieľ je získať kompletný stacktrace, keď zabalím chybu do inej; trochu ako pri stacktrace výnimky v Jave:

Message of exception 1
...
Caused by: Message of exception 2
...
Caused by: Message of the root exception

Skúšam tento kód, ale err1 si neponecháva odkaz na err2:

// CODE
try {
    try {
        throw new Error("Error no2");
    } catch (err2) {
        console.log("========================================");
        console.log(err2);
        throw new Error("Error no1");
    }
} catch (err1) {
    console.log("========================================");
    console.log(err1);
}
// CONSOLE OUTPUT
node test.ts 
========================================
Error: Error no2
    at Object.<anonymous> (/tmp/test.ts:3:15)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11
========================================
Error: Error no1
    at Object.<anonymous> (/tmp/test.ts:7:15)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11

Okrem toho, nenašiel som žiadnu vlastnosť, ktorá by sa volala cause v triede Error. Existuje vlastnosť stack, ale myslím si, že je to zlý zvyk ju meniť.

Ďakujem!

Odpoveď č. 1

Odpoveď z roku 2021: Teraz existuje štandardný spôsob, ako spravovať a uchovávať príčinu chyby. Konštruktor Error() môže teraz ako druhý argument prijímať objekt options. Tento objekt options by mal mať vlastnosť cause, ktorá by obyčajne bola ďalšou Error, ale nemusí byť.

Príklad

throw new Error('Outer Error', {cause: new Error('Inner Error')});

Podpora

V čase písania (október 2021) je nový konštruktor podporovaný vo Firefoxe, Chrome a Safari. Ak chcete zistiť príčinu Error, budete musieť preskúmať jeho vlastnosť cause. Okrem toho vo Firefoxe dostávame v konzole aj trochu extra informácií, napríklad

Uncaught Error: Outer Error
    <anonymous> debugger eval code:1
Caused by: Error: Inner Error
    <anonymous> debugger eval code:1

Edge momentálne jednoducho ignoruje druhú vlastnosť konštruktora.

Zdroj(y)

Mozilla dokumentácia: https://developer.mozilla.org/en-US/docs/web/javascript/reference/global_objects/error

Návrh ECMAScript: https://github.com/tc39/proposal-error-cause

Súvisiace články