在 JavaScript 中,你可以通过扩展内置的 Error
类来创建自定义错误类型。这有助于创建更具语义化的错误,并能在错误处理时提供更多上下文信息。
class CustomError extends Error {
constructor(message) {
super(message); // 调用父类构造函数
this.name = "CustomError"; // 设置错误名称
// 保持正确的堆栈跟踪(V8引擎)
if (Error.captureStackTrace) {
Error.captureStackTrace(this, CustomError);
}
}
}
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);
}
}
name
属性:这有助于识别错误类型Error.captureStackTrace
**:这会提供更好的堆栈跟踪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,可以这样定义:
class CustomError extends Error {
constructor(public readonly code: number, message: string) {
super(message);
this.name = "CustomError";
if (Error.captureStackTrace) {
Error.captureStackTrace(this, CustomError);
}
}
}
自定义错误类型使得错误处理更加清晰和有组织,特别是在大型应用程序中。