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

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

理解异常处理机制

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

基本原则

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

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

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

GraphQL Schema

1
2
3
4
5
6
7
8
9
type User {
id: ID!
name: String!
email: String!
}

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

解析器实现

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 中,标准的错误响应格式通常是一个包含错误信息的数组。我们可以根据需要定制错误信息的返回格式。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 错误的标准化响应

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

1
2
3
4
5
6
7
8
9
{
"errors": [
{
"message": "User with ID 2 not found.",
"code": "USER_NOT_FOUND"
}
],
"data": null
}

小结

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

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

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

https://zglg.work/graphql-api-dev-zero/17/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论