关于async里面try/catch的一个问题
发布于 5 年前 作者 yviscool 5707 次浏览 来自 问答
function foo(){ throw new Error('zjl')}
function*fn(){
	try{
		yield foo();
	}catch(e){
		console.log(e)
	}
}

上面会被caty/catch ,而下面这个Promise就不会被try/catch

function * fn(){
  yield Promise.reject('ixl')
}
//执行next后,会报错.
function *fn(){
  try{
     yield Promise.reject('ixl')
  }catch(e){
    console.log(e)
  }
}
//也会报错

而async里面,我看了下对await进行try/catch 可以避免 处于rejected状态的promise跳出async函数 怎么做到的?

7 回复

没有谁说过 yield 后能捕捉到 promise 的 reject 错误吧…

你肯定是被 co 库误导了,co 执行 generator 能用 try catch 捕获是因为它做了特殊处理,简单的说就是 reject 后会 throw 出异常

原生 generator 可不自带這個功能喔

来自酷炫的 CNodeMD

@hyj1991 还有个问题,

function* fn(){
	try{
		yield Promise.reject('ixl')
	}catch(e){
		console.log(e)
	}
		
}
function foo(){
	var g = fn()
	var next = g.next(undefined)
	Promise.resolve(next.value).then(function(){
	},function(e){
		try{
			g.throw(e)
		}catch(e){
			console.log(e)
		}
	})
}

也就说外面的catch会先于里面的catch?

@5196666qwe 没看明白你说的外面和里面指的是啥,但是这段代码流程一定是这样:

  • 第一个 g.next().value 得到的值是一个 rejected 状态的 promise
  • Promise.resolve( rejected ),那么就会走到后面的 then 方法注册的 onReject 函数中
  • 你在这个 onReject 中调用了 g.throw ,那么在这个 onReject 函数中 try 不 try 无所谓,因为 g.throw 相当于在 generator 函数中对应的位置 throw 了,所以会被 generator 函数中的 try catch 捕获,实际上 co 库也是利用这一点实现的 try catch 捕获异常

@hyj1991 外面是 fn generator里的try/catch ,里面是 onreject里面的try/catch,而我实验过了,把fn里面的try/catch去掉了,下面的try/catch是会执行的。。。

@5196666qwe 那必须啊,我说的无所谓是因为你在 generator 里面 try 了,要是 generator 里面没 try,那这个错误肯定会继续向外抛出呀

@hyj1991 懂了,谢谢解答

来自酷炫的 CNodeMD

回到顶部