Vue3/状态管理/组件:不必要的尝试/捕获



我希望这个问题能达成普遍共识,我不是在征求人们的意见。

我的组件分派了一个操作方法:

await dispatch('someAction', payload)

存储

async someAction({commit}, payload){
try {
const data = await http.get('/foobar', payload)
commit('someCommit', data.data)
} catch (error) {
throw error
}
}

在存储方法中,try/catch抛出了一个Eslint错误不必要的try/catch,这对我来说没有意义。服务器可能会抛出错误,http调用可能会失败,因此为了避免commit启动,我添加了一个try/catch块。我想我可以添加一个if (data) commit(...,但用try/catch不是更干净吗?

此外,在catch中,我抛出错误,以便可以停止原始调度调用(如果它在自己的try/catch中(。

我在这里做错了吗?有没有一种"更好"的做事方式?

从文档

只重新引发原始错误的catch子句是多余的,对程序的运行时行为没有影响。这些多余的子句可能会造成混乱和代码膨胀,因此最好不要使用这些不必要的catch子句。

处理错误的首选方法是……好吧,处理它。记录它,以某种方式响应它,只是不要抛出它。然而,正如文档所说,

如果您不想被通知不必要的catch子句,您可以安全地禁用此规则。

这可以在您的eslint配置中完成:

"rules": {
"no-useless-catch": "off" // "off" or 0 both work
}

**Try-catch会立即抓取堆栈并触发catch。。。你可以在那里放任何类型的回调。。。比如,你可以递归地再次执行函数来重试。。。

此外,您不必担心pinia中的分派和类似的事情,只需在操作中使用它,就好像它是一个普通的javascript类一样。

state =( (){
color = "red"
},
actions{
changeColors{
try{
const colors = await api.getColors()
this.colors = colors.data // this doesnt fire if the request fails 
}
catch(error){
// were only here because of the fact that the runtime 
// threw an error... If we dont catch it nodejs crashes...
// now you do anything you want here -> -> -> but just know the code 
// above did not complete... so thats what you do here.
console.log(error)
anyFunction(error)
}
},
})

当你发现错误时。。。您正在捕获在try块内抛出的错误。。。所以绕圈子然后重新思考…这是浪费内存,就像控制台记录控制台日志一样。。。

这就是为什么人工智能生成的代码毫无用处的原因(只是猜测你是从某个东西中生成的……并不是以负面的方式说出来……你知道代码是什么,但你不会使用throw,你会使用console.log(error.message或其他你关心的东西(。或者使用某种类型的中间件将其转发回用户。

)。当您没有抛出错误时,它会导致运行时终止。当你发现错误时。。。你试图通过把它变成一个事件监听器来防止这种情况发生。。。当抛出错误时,请执行以下操作。。。转身扔。。。是对资源的浪费,尤其是如果你在react where或vue之类的事情上使用这种类型的设计模式,你会以微小的变化方式做数百次相同的事情。

最新更新