是否可以使用try-catch重写下一个代码?我听说现代JS支持它。
{
// GET /someUrl
this.$http.get('/someUrl').then(response => {
// get body data
this.someData = response.body;
}, response => {
// error callback
});
}
答案 0 :(得分:1)
是的,通过try catch,我假设您是指ES6中引入的异步/等待。值得牢记的是,异步/等待仅在promise对象上起作用并执行完全相同的功能,但只是为您提供了一种更同步的方式来编写代码(在大多数情况下)更易于阅读。
使用异步等待,promise将解析并返回该值,然后继续执行下一行代码,可以在catch块中处理任何异常,如下所示:
const someFunc = async () => {
try {
const response = await this.$http.get('/someUrl');
console.log(response);
} catch(err){
// Error handling
throw new Error(err);
}
}
答案 1 :(得分:-1)
尽管许多人可能会指向您async
/ await
,因此您可以使用实际的try
/ catch
关键字,但我认为了解您拥有的代码更为重要并做出明智的决定。最重要的是,promise已经为您处理了try
/ catch
。让我们潜入。
在此代码中,您正在处理承诺。
goDoSomething().then(callThisFunctionWithResultsWhenDone);
我最喜欢的Promises属性之一是它们已经处理
try
/ catch
为您服务。
goDoSomething()
.then(doSomethingThatThrows)
.catch(doSomethingWithYourError)
.then(otherwiseKeepGoing)
注意,我使用了.catch
而不是在同一行中传递错误处理程序。内联错误处理程序无法达到您的预期,因此我避免了。使用.catch()
可使您通过短路一系列操作或单独处理一系列步骤中的错误来智能地处理异步错误,而不会中断管道。
goDoSomething()
.then(throwError)
.then(thisIsSkipped)
.then(thisToo)
.catch(handleErrorButDontRethrow)
.then(doThisWithOrWithoutError)
.then(finishUp)
我总是喜欢将这种样式视为管道。每个catch
语句都会捕获到上面的错误,直到上一个catch
。
所以,就您而言:
$http.get(...)
.catch(handleRequestError)
.then(process)
.catch(handleProcessingError)
这将处理所有可能的错误,但是通常为了处理请求错误,您实际上会跳过处理步骤,因此:
$http.get(...)
.then(process)
.catch(handleProcessingError)
同样,如果处理失败,则调用此块的任何对象可能只想跳过下一个块。然后剩下的就是:
$http.get(...)
.then(process)
如果您发现自己重新投掷鱼钩,也许应该将鱼钩移开并使其冒泡。
IMO,这是更加惯用的JS代码。如果您首先学习其他语言,则async
/ await
引入的样式会稍微熟悉一些,但是它带来了非常必要的感觉。为了灵活地分别处理每个异步操作,您的async
/ await
代码需要看起来像这样:
let intermediateStateStorage;
try {
intermediateStateStorage = await goDoSomething();
} catch {
handleThis();
}
try {
intermediateStateStorage = await process(intermediateStateStorage);
} catch {
handleThisOne();
}
相比于:
goDoSomething()
.catch(handleThis)
.then(process)
.catch(handleThisOne)
都不是坏事,我显然有优先选择权,但我认为您想知道您要处理的内容,因此您可以做出明智的决定。