HLJ 发布于
2025-06-11 10:44:07
1阅读

JavaScript自定义Error扩展方法

JavaScript 自定义 Error:扩展 Error 类

在 JavaScript 中,你可以通过扩展内置的 Error 类来创建自定义错误类型。这有助于创建更具语义化的错误,并能在错误处理时提供更多上下文信息。

基本自定义 Error 类

class CustomError extends Error {
  constructor(message) {
    super(message); // 调用父类构造函数
    this.name = "CustomError"; // 设置错误名称
    // 保持正确的堆栈跟踪(V8引擎)
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, CustomError);
    }
  }
}

带有额外属性的自定义 Error

class HttpError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.name = "HttpError";
    this.statusCode = statusCode;
    
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, HttpError);
    }
  }
}

// 使用示例
try {
  throw new HttpError("Not Found", 404);
} catch (error) {
  if (error instanceof HttpError) {
    console.error(`HTTP Error ${error.statusCode}: ${error.message}`);
    console.error(error.stack);
  }
}

最佳实践

  1. 总是设置 name 属性:这有助于识别错误类型
  2. **考虑使用 Error.captureStackTrace**:这会提供更好的堆栈跟踪
  3. 添加有意义的属性:为错误添加相关上下文信息
  4. 保持与内置 Error 的兼容性:确保你的自定义错误可以被常规的 try/catch 捕获

更复杂的示例

class ValidationError extends Error {
  constructor(field, message) {
    super(`Validation failed for ${field}: ${message}`);
    this.name = "ValidationError";
    this.field = field;
    this.validationMessage = message;
    
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, ValidationError);
    }
  }
}

// 使用示例
function validateUser(user) {
  if (!user.name) {
    throw new ValidationError("name", "Name is required");
  }
  if (user.age < 18) {
    throw new ValidationError("age", "Must be at least 18 years old");
  }
}

try {
  validateUser({ age: 16 });
} catch (error) {
  if (error instanceof ValidationError) {
    console.error(`Validation error in field '${error.field}': ${error.validationMessage}`);
  } else {
    console.error("Unexpected error:", error);
  }
}

TypeScript 中的自定义 Error

如果你使用 TypeScript,可以这样定义:

class CustomError extends Error {
  constructor(public readonly code: number, message: string) {
    super(message);
    this.name = "CustomError";
    
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, CustomError);
    }
  }
}

自定义错误类型使得错误处理更加清晰和有组织,特别是在大型应用程序中。

当前文章内容为原创转载请注明出处:http://www.good1230.com/detail/2025-06-11/827.html
最后生成于 2025-06-13 20:53:37
此内容有帮助 ?
0