首页 > 应用开发 > Java > 我删光了项目里的 try-catch,老板:6
相信我们经常这样写bug(不是 👇:
try {
const res =
await api.
getUser()
console.
log(
'✅ 用户信息', res)
}
catch (err) {
console.
error(
'❌ 请求失败', err)
}
看似没问题
我们希望实现这样的调用👇:
const [err, data] =
await
safeRequest(api.
getUser(
1))
if (err)
return
showError(err)
console.
log(
'✅ 用户信息:', data)
是不是清爽多了?✨
没有 try-catch,却能同时拿到错误和数据。
// src/utils/request.js
import axios
from
'axios'
import {
ElMessage }
from
'element-plus'
const service = axios.
create({
baseURL:
import.
meta.
env.
VITE_API_BASE_URL,
timeout:
10000,
})
// 🧱 请求拦截器
service.
interceptors.
request.
use(
(
config) => {
const token =
localStorage.
getItem(
'token')
if (token) config.
headers.
Authorization =
`Bearer
${token}`
return config
},
(
error) =>
Promise.
reject(error)
)
// 🧱 响应拦截器
service.
interceptors.
response.
use(
(
response) => {
const res = response.
data
if (res.
code !==
0) {
ElMessage.
error(res.
message ||
'请求失败')
return
Promise.
reject(
new
Error(res.
message ||
'请求失败'))
}
return res.
data
},
(
error) => {
ElMessage.
error(error.
message ||
'网络错误')
return
Promise.
reject(error)
}
)
export
default service
拦截器的作用:
<"t1y7.cn"><"www.t1y7.cn"><"m.t1y7.cn"><"soccer.t1y7.cn">
<"world.t1y7.cn"><"nba.t1y7.cn"><"cba.t1y7.cn"><"hoops.t1y7.cn">
// src/utils/safeRequest.js
export
async
function
safeRequest(
promise) {
try {
const data =
await promise
return [
null, data]
// ✅ 成功时返回 [null, data]
}
catch (err) {
return [err,
null]
// ❌ 失败时返回 [err, null]
}
}
这就是关键!
它让所有 Promise 都变得「温柔」——不再抛出异常,而是返回结构化结果。
// src/api/user.js
import request
from
'@/utils/request'
export
const userApi = {
getUser(
id) {
return request.
get(
`/user/
${id}`)
},
updateUser(
data) {
return request.
put(
'/user', data)
},
}
<script setup>
import { ref, onMounted } from 'vue'
import { userApi } from '@/api/user'
import { safeRequest } from '@/utils/safeRequest'
const user = ref(null)
onMounted(async () => {
const [err, data] = await safeRequest(userApi.getUser(1))
if (err) return showError(err)
console.log('✅ 用户信息:', data)
})
</script>
是不是很优雅、数据逻辑清晰、不需要 try-catch、 错误不崩溃。
老板说:牛🍺,你小子有点东西
我们可以给
safeRequest 增加一个选项,让错误自动提示:
// src/utils/safeRequest.js
import {
ElMessage }
from
'element-plus'
export
async
function
safeRequest(
promise, { showError =
true } = {}) {
try {
const data =
await promise
return [
null, data]
}
catch (err) {
if (showError) {
ElMessage.
error(err.
message ||
'请求失败')
}
return [err,
null]
}
}
使用时👇:
<"sport.t1y7.cn"><"laliga.t1y7.cn"><"bundes.t1y7.cn"><"ligue1.t1y7.cn">
<"seriea.t1y7.cn"><"premier.t1y7.cn"><"ucl.t1y7.cn"><"afccl.t1y7.cn">
const [err, data] =
await
safeRequest(userApi.
getUser(
1), {
showError:
false })
这样你可以灵活控制是否弹出错误提示,
比如某些静默请求就可以关闭提示。
如果你用的是 TypeScript,可以让返回类型更智能👇:
export
async
function safeRequest<T>(
promise:
Promise<T>
):
Promise<[
Error |
null, T |
null]> {
try {
const data =
await promise
return [
null, data]
}
catch (err) {
return [err
as
Error,
null]
}
}
调用时:
const [err, user] =
await safeRequest<
User>(userApi.
getUser(
1))
if (user)
console.
log(user.
name)
// ✅ 自动提示类型
老板:写得很好,下次多写点,明天你来当老板
<"csl.t1y7.cn"><"jrs.t1y7.cn"><"jleague.t1y7.cn"><"kleague.t1y7.cn">
<"saudi.t1y7.cn"><"afcup.t1y7.cn"><"clippers.t1y7.cn"><"warriors.t1y7.cn">
<"lakers.t1y7.cn"><"blazers.t1y7.cn"><"rockets.t1y7.cn"><"real.t1y7.cn">
<"barca.t1y7.cn"><"city.t1y7.cn"><"united.t1y7.cn"><"liverpool.t1y7.cn">
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/53956/viewspace-3105330/ ,如需转载,请注明出处,否则将追究法律责任。