JavaScript / TypeScript: стандартный способ устранения причины ошибки - PullRequest
2 голосов
/ 02 марта 2020

У меня есть опыт работы с Java разработчиком, и я довольно новичок в JavaScript / TypeScript.

Существует ли стандартный способ для управления и сохранения причины ошибки в JavaScript / TypeScript?

Моя цель - получить полную трассировку стека, когда я помещаю ошибку в другую; немного как с Java Трассировка стека исключений:

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

Я пытаюсь этот код, но err1 не сохраняет ссылку 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

Кроме того, я не нашел ни одного свойства с именем cause в классе Error. Есть свойство stack, но я думаю, что менять его - плохая практика.

Спасибо!

1 Ответ

0 голосов
/ 02 марта 2020

Я всегда использовал модификацию Ответ Кристиана здесь

class TraceableError extends Error {
  trace: Error;

  constructor(message?: string, innerError?: Error) {
    super(message); 
    this.trace = innerError;

    const actualProto = new.target.prototype;

    if (Object.setPrototypeOf) { Object.setPrototypeOf(this, actualProto); } 
    else { this.__proto__ = actualProto; } 
  }
}

Тогда вы бы бросили вот так

try {
    try {
        throw new Error("Error no2");
    } catch (err2) {
        console.log("========================================");
        console.log(err2);
        throw new TraceableError ("Error no1", err2);
    }
} catch (err1) {
    console.log("========================================");
    console.log(err1);
}

Обратите внимание, что если не пойман, часть новой ошибки trace не будет выводиться на консоль.

...