我知道是用 reject来抛出错误,但是 如果 在一个大大的try catch里面 有很多普通函数 怎么抛出异常呢
比如说
async function insert(id) { if(id == 6) { return new Promise((resolve,reject) => {reject(“aaa”)}); } await db.insert(); //something… } (async () =>{ try { await insert(6); } catch(e) { res.end({error:true,msg:e}); } })();
上面就是一个简单的 判断id的函数 没有复杂的 异步 但是如果这个函数出问题了 要new一个promise来返回错误吗 还是像这样
async function insert(id) { return new Promise( (resolve,reject) => { if(id == 6) { return reject(“aaa”); } await db.insert(); //something… } ); }
把函数所有的代码都 包到一个大大的 primise里面 ?
async function insert(id) {
if(id == 6) {
return Promise.reject(“aaa”);
}
await db.insert();
//something…
}
const { reject } = Promise
async function insert(id) {
if(id == 6) {
return reject(“aaa”);
}
await db.insert();
//something…
}
哥哥 既然try catch了 出错就throw new Error();既可以了
@burning0xb 大哥 不能 throw new Error啊 如果抛出error代码直接就崩溃了
@h87kg 原来Promise有静态方法的啊
@burning0xb 测试回复 不好意思
在最外层 try catch,里面 throw 的错误会冒泡被捕获到,再做处理就好了
...
catch(err) {
next(err)
}
@gwyy catch住怎么会崩溃
@burning0xb 真的 catch住 throw new Error 也会崩溃
不是很明白你说的,不过我这样是没问题的
class App {
constructor() {
this.num = 0;
const method = Object.getOwnPropertyNames(App.prototype);
method.map((key) => {
if (key !== 'constructor' && key !== 'bindMethod') {
this[key] = App.prototype[key].bind(this);
}
});
}
async _catch() {
this.num++;
if (this.num < 6) {
await this._catch();
} else {
throw new Error('exception');
}
}
async __main__() {
try {
await this._catch();
} catch (err) {
console.log(err);
console.log('I catch it');
}
setInterval(() => {
console.log('hi');
}, 3000)
}
}
const app = new App();
app.__main__();
zan
参考lodash的 attempt exports.attempt = function (promiseFn, …args) { return promiseFn.apply(null, args).then( function (result) { return result; }, function (e) { return _.isError(e) ? e : new Error(e); } ).catch(function (e) { return e; }); };
使用 let result = await attempt(promisefn, arguments); 判断 result 是不是error _.isError(result); 我是这样处理的