Skip to content

错误处理 ​

unix-request 把 uni.request 分散的错误语义(回调 fail 的原生 errCode、HTTP statusCode、取消、参数校验)收敛为统一的 RequestError(对标 AxiosError),所有请求失败一律以它 reject。

RequestError 字段表 ​

字段类型说明
codeRequestErrorCode库内错误码,8 类字面量联合(见下表)
errSubjectstring固定 'unix-request',用于业务过滤本库错误(常量 REQUEST_ERR_SUBJECT)
errMsgstring错误描述;原生失败时为原生 errMsg 透传
nativeErrCodenumber | null原生 fail errCode 原值透传不翻译(5 / 600003 / …);库内错误为 null
statusCodenumber | nullHTTP 状态码(仅 ERR_BAD_REQUEST / ERR_BAD_RESPONSE 时有值)
configRequestConfig | null发起该请求的最终合并配置(发送快照)
responseResponseAny | nullHTTP 错误时携带响应原文(含 4xx/5xx body),其余为 null

八类错误码 ​

code触发场景发网络nativeErrCodestatusCoderesponse
ERR_PARAM参数非法(url 为空等)否nullnullnull
ERR_CONFIG配置非法(未设 baseURL 却用相对路径)否nullnullnull
ERR_CANCELEDcancelToken 主动取消(发送前或飞行中)视时机nullnullnull
ERR_TIMEOUT超时(原生 errCode 5 归类)是5nullnull
ERR_NETWORK网络错误(原生 600003 / 600010 归类)是原值nullnull
ERR_BAD_REQUESTHTTP 4xx(validateStatus 未通过且 statusCode < 500)是null4xx 值响应原文
ERR_BAD_RESPONSEHTTP 5xx(validateStatus 未通过且 statusCode >= 500)是null5xx 值响应原文
ERR_NATIVE其余原生失败(1000 / 100001–100003 / 600008 / 600009 / 602001 等)与拦截器 / transform 异常视场景原值(原生失败时)nullnull

归类是确定性映射,无歧义分支;nativeErrCode 一律原值透传,不做翻译与二次映射——需要区分更细的原生语义时以它为准。

基础处理模式 ​

uts
import { get } from '@/uni_modules/ux-request'
import type { RequestError, ResponseAny } from '@/uni_modules/ux-request'

get<any>('/api/user/1', null).catch((err) => {
	const e = err as RequestError
	if (e.code == 'ERR_CANCELED') {
		return // 取消不算异常,静默即可
	}
	if (e.code == 'ERR_BAD_REQUEST' || e.code == 'ERR_BAD_RESPONSE') {
		let sc = 'null'
		if (e.statusCode != null) {
			sc = e.statusCode.toString()
		}
		const resp = e.response
		if (resp != null) {
			console.log('HTTP ' + sc + ' body=' + JSON.stringify(resp.data))
		}
		return
	}
	console.log(e.code + ' ' + e.errMsg)
})

HTTP 错误挂载响应原文 ​

4xx / 5xx 时 err.response 是完整响应对象,服务端返回的错误 body(如 { "message": "not found" })就在 response.data 里:

uts
request<any>({ url: '/api/http/statusCode/404' }).catch((err) => {
	const e = err as RequestError
	// e.code === 'ERR_BAD_REQUEST'
	// e.statusCode === 404
	// e.response.statusCode === 404,e.response.data === 服务端 404 响应体
	// e.config.url === 实际请求的完整地址
})

errSubject 过滤模式 ​

errSubject 固定为 'unix-request'。当错误可能来自多层(如响应拦截器换错、多个库混合、原生回调透传)时,用它做来源过滤:

uts
import { REQUEST_ERR_SUBJECT } from '@/uni_modules/ux-request'

if (e.errSubject === REQUEST_ERR_SUBJECT) {
	// 确定是本库抛出的错误
}

配合拦截器做集中处理 ​

两段式分工最清晰:拦截器里做上报与可恢复错误的兜底,调用侧只处理业务性失败:

uts
import { useResponseInterceptor } from '@/uni_modules/ux-request'
import type { RequestError } from '@/uni_modules/ux-request'

useResponseInterceptor(null, (err: RequestError): any | null => {
	report(err) // 全局上报
	if (err.code == 'ERR_TIMEOUT') {
		return makeFallback() // 也可以选择恢复:返回 ResponseAny 转成功
	}
	return null // 其余放行给业务侧 catch
})
  • 需要把特定错误「转成功」→ 拦截器恢复路径,见拦截器;
  • 需要区分原生明细 → 读 nativeErrCode,归类映射关系见请求流程原理;
  • 各端超时 / 网络错误的表现差异(如 Web 端不可路由地址可能归类 ERR_NETWORK)→ 见平台兼容性。

类型定义见 API 文档 RequestError 与 RequestErrorCode。

Released under the MIT License.