Jupyter AI

17 处理错误与异常之如何处理错误

📅 发表日期: 2024年8月15日

分类: 🔗GraphQL API 开发入门

👁️阅读: --

在上一篇中,我们讨论了常见的错误类型以及它们在 GraphQL API 中可能引发的问题。这一篇将补充如何在 GraphQL API 中有效地处理这些错误和异常,以确保我们的应用能够优雅地处理问题,提供良好的用户体验。

理解异常处理机制

在构建 GraphQL API 时,错误处理至关重要。通过捕获和处理错误,我们可以避免将系统错误暴露给用户,同时可以为开发者提供有用的信息。

基本原则

  1. 捕获异常:使用 try-catch 块来捕获可能抛出的异常。
  2. 返回统一格式的错误响应:确保 API 返回的错误信息遵循统一的格式,方便前端处理。
  3. 记录错误:在适当的地方记录错误日志,以便后续排查。

案例:处理异常并返回标准化错误格式

假设我们有一个简单的 GraphQL 查询,用于获取用户信息。在这个过程中,我们需要处理潜在的异常。

GraphQL Schema

type User {
  id: ID!
  name: String!
  email: String!
}

type Query {
  user(id: ID!): User
}

解析器实现

在解析器中,我们将使用 try-catch 块来捕获异常。

const resolvers = {
  Query: {
    user: async (_, { id }) => {
      try {
        const user = await getUserById(id); // 模拟获取用户的函数
        if (!user) {
          throw new Error(`User with ID ${id} not found.`);
        }
        return user;
      } catch (error) {
        // 捕获并抛出 GraphQL 错误
        throw new Error(`An error occurred: ${error.message}`);
      }
    },
  },
};

// 假设的函数用于模拟数据库查询
async function getUserById(id) {
  if (id === "1") {
    return { id: "1", name: "Alice", email: "alice@example.com" };
  }
  return null; // 返回 null 模拟没有找到用户
}

错误处理的响应格式

在 GraphQL API 中,标准的错误响应格式通常是一个包含错误信息的数组。我们可以根据需要定制错误信息的返回格式。

下面是一个修改后的错误处理示例,在获取用户信息时,返回一个结构化的错误响应:

const resolvers = {
  Query: {
    user: async (_, { id }) => {
      try {
        const user = await getUserById(id);
        if (!user) {
          throw new UserNotFoundError(id); // 使用自定义错误类
        }
        return user;
      } catch (error) {
        // 记录并返回错误信息
        logError(error);
        throw formatGraphQLError(error);
      }
    },
  },
};

// 自定义错误类
class UserNotFoundError extends Error {
  constructor(id) {
    super(`User with ID ${id} not found.`);
    this.name = "UserNotFoundError";
  }
}

// 格式化 GraphQL 错误
function formatGraphQLError(error) {
  return {
    message: error.message,
    code: error.name === "UserNotFoundError" ? "USER_NOT_FOUND" : "INTERNAL_SERVER_ERROR",
  };
}

// 记录错误的函数(可以用 Logger 工具实现)
function logError(error) {
  console.error(`[Error]: ${error.message}`);
}

GraphQL 错误的标准化响应

通过上述的实现,当用户请求一个不存在的用户时,返回的错误信息将会格式化为如下结构:

{
  "errors": [
    {
      "message": "User with ID 2 not found.",
      "code": "USER_NOT_FOUND"
    }
  ],
  "data": null
}

小结

在本篇中,我们了解了如何在 GraphQL API 中处理错误与异常,确保错误被优雅地捕获并以结构化的格式返回。接下来,我们将在下一篇中深入探讨如何定制错误消息,以更好地满足不同场景下的需求。

希望通过一系列的错误处理机制,您能够加强对 GraphQL API 的开发质量控制,使得您的应用更加健壮,用户体验更佳。