uni-app x中使用Promise中reject一个对象出来无论catch中捕获的类型都是Error

uni-app x中使用Promise中reject一个对象出来无论catch中捕获的类型都是Error

开发环境 版本号 项目创建方式
Windows Windows 10 HBuilderX
家庭中文版19045
3570

产品分类:uniapp/App

PC开发环境操作系统:Windows

手机系统:Android

手机系统版本号:Android 12

手机厂商:模拟器

手机机型:mumu

页面类型:vue

vue版本:vue3

打包方式:云端

示例代码:

export class ResponseError extends Error {  
    constructor(errCode : number, errMsg : string,data:any|null) {  
        super(errMsg);  
        this.errCode = errCode;  
        this.errMsg = errMsg;  
        this.data = data  
    }  
    /**  
     * 错误代码。  
     */  
    errCode : number;  
    /**  
     * 错误消息  
     */  
    errMsg : string;  
    data ?: any | null;  
}  
protected async Request2(apiPath : string, method : "GET" | "POST" | "PUT" | "PATCH" | "DELETE", data : UTSJSONObject | null) : Promise<unknown> {  
                return new Promise((resolve, reject) => {  
            // 发送请求  
            uni.request({  
                url: this.ServerAddress + apiPath,  
                data,  
                method,  
                success: (res) => {  
                    console.log(res);  
                    if (res.statusCode == 200) {  
                        resolve(res.data)  
                    }  
                    else {;  
                        reject(new ResponseError(res.statusCode,"请求异常",res.data))  
                    }  
                },  
                fail(err) {  
                    reject(new ResponseError(err.errCode,err.errMsg,err.data))  
                }  
            })  
        });  
    }  

    /**  
     * 用户登录  
     */  
    public Login(data : UTSJSONObject | null)  {  
        this.Request2("/Token", "POST", {account:'test',password:'kkk123'}).then().catch((res) => {  
            console.log(res as ResponseError);  
        })  
    }

操作步骤:

在uvue页面的onload中调用Login  

onLoad() {  
            let apiRequest : ApiRequest = new ApiRequest();  
            apiRequest.Login().then()  

    }

预期结果:

预期:在接口返回的statusCode 不为200代码时,Login方法中通过catch捕获异常,在的console.log中打印ResponseError类型数据包含statusCode,errMsg,data等。

实际结果:

UTSError(name='Error', message='请求异常', cause='null')
`

更多关于uni-app x中使用Promise中reject一个对象出来无论catch中捕获的类型都是Error的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

直接访问下errMsg这些属性,是否符合预期

更多关于uni-app x中使用Promise中reject一个对象出来无论catch中捕获的类型都是Error的实战教程也可以访问 https://www.itying.com/category-93-b0.html


用console.log在控制台打印,打印出来的内容起始位置显示UTSError。使用类型断言把catch中捕获的res as ResponseError,在控制台打印还是只有打印出了name, message, cause三个属性。

神奇!直接访问errCode,errMsg这些属性都可以访问到。谢谢!

在uni-app x中,Promise的reject会强制将错误对象转换为Error类型,这是JavaScript/TypeScript的默认行为。即使你抛出自定义错误类型ResponseError,在catch中捕获的也会被包装成UTSError。

解决方案:

  1. 修改你的代码,在catch中通过error对象的属性来获取原始错误信息:
public Login(data : UTSJSONObject | null) {
    this.Request2("/Token", "POST", {account:'test',password:'kkk123'})
        .catch((error) => {
            console.log({
                errCode: error.cause?.errCode || error.errCode,
                errMsg: error.message || error.errMsg,
                data: error.cause?.data || error.data
            });
        })
}
  1. 或者将错误信息作为普通对象返回而不是使用Error对象:
reject({
    errCode: res.statusCode,
    errMsg: "请求异常",
    data: res.data
})
回到顶部