typescript JavaScript /类型脚本:保留错误原因的标准方法

wa7juj8i  于 2022-12-30  发布在  TypeScript
关注(0)|答案(3)|浏览(165)

我有Java开发人员的背景,对JavaScript/TypeScript还很陌生。
是否有标准方法来管理和保留JavaScript/TypeScript中错误的原因?
我的目的是在将一个错误 Package 到另一个错误中时获得完整的堆栈跟踪;有点像Java异常堆栈跟踪:

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

我尝试了这段代码,但是err1没有保留err2的引用:
x一个一个一个一个x一个一个二个x
另外,我没有在Error类中找到任何名为cause的属性。有一个stack属性,但我认为更改它是一个不好的做法。
谢谢!

fkaflof6

fkaflof61#

    • 2021年答案**:现在有一个标准的方法来管理和保持错误的原因。Error()构造函数现在可以接受一个options对象作为第二个参数。这个options对象应该有一个cause属性,这个属性通常是另一个Error,但它不一定是。
    • 示例**
throw new Error('Outer Error', {cause: new Error('Inner Error')});
    • 支持**

在撰写本文时(2021年10月),Firefox、Chrome和Safari都支持新的构造函数。要获得Error的原因,您需要查询它的cause属性。此外,在Firefox中,我们在控制台中获得了一些额外的信息,例如

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

Edge当前将忽略第二个构造函数属性。

    • 资料来源**

Mozilla文档:https://developer.mozilla.org/en-US/docs/web/javascript/reference/global_objects/error
ECMAScript提案:https://github.com/tc39/proposal-error-cause

mbyulnm0

mbyulnm02#

我一直使用Kristian's answer here的修改

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部分将不会输出到控制台。

rjzwgtxy

rjzwgtxy3#

我经常使用错误原因选项。我的记录器使用的文本构建函数如下所示

export function getErrorMessageWithCausedByParts(err: Error, stack=true): string {
  const doNewLines = stack;
  let txt = "";
  
  if(stack) {
    txt+=err.stack;
  } else {
    txt+=err.message;
  }

  if(err.cause != null) {
    if (err.cause instanceof Error) {
      if(doNewLines) {
        txt+="\n[caused by] ";
      } else {
        txt += " [caused by] ";
      }
      
      txt += getErrorMessageWithCausedByParts(err.cause, stack);
    } else {
      txt += `[Unknown cause type?!]: ${JSON.stringify(err.cause)}`
    }
  }

  return txt;
}

注意:为了能够使用Error对象的cause选项,您必须在tsconfig.json中设置一个更新的ES版本

"compilerOptions": {

    "lib": ["es2022"]

    ...
}

相关问题