async/await 代码应该完全包含在 try 块中吗?
Should async/await code be entirely contained with try block?
我一直在阅读新的 async/await 并在 Node 8 中使用它。我遇到过一些人将所有内容都放在初始的 try
块中,并且其他人只有 await
,其余的都在 try/catch 以下。这个比那个好吗?这是我自己的代码中的功能之一在两种风格中表达我的意思:
async function findCurrentInstallations() {
try {
const results = await installations.find({});
if (results.length === 0) { throw new Error('No installations registered'); }
return results;
} catch (err) {
throw err;
}
}
--
async function findCurrentInstallations() {
let results;
try {
results = await installations.find({});
} catch (err) {
throw err;
}
if (results.length === 0) { throw new Error('No installations registered'); }
return results;
}
在您提供的示例中根本不需要 try
和 catch
,这是 async
函数的默认行为。
你的两个代码片段的不同之处在于第一种情况下的 throw new Error(...
将由 catch
子句处理。但由于 catch
子句出于所有实际目的都是空操作,传递,所以它并不重要。
我会这样写:
async function findCurrentInstallations() {
const results = await installations.find({});
if (results.length === 0) { throw new Error('No installations registered'); }
return results;
}
只包装 await
,只会捕获等待失败引发的错误,如果代码中的任何一行失败,包装整个事情都会失败,这取决于您想要捕获的内容。
请注意,您只是抛出了示例,这是无用的,因为应用程序在失败时无论如何都会抛出。
我一直在阅读新的 async/await 并在 Node 8 中使用它。我遇到过一些人将所有内容都放在初始的 try
块中,并且其他人只有 await
,其余的都在 try/catch 以下。这个比那个好吗?这是我自己的代码中的功能之一在两种风格中表达我的意思:
async function findCurrentInstallations() {
try {
const results = await installations.find({});
if (results.length === 0) { throw new Error('No installations registered'); }
return results;
} catch (err) {
throw err;
}
}
--
async function findCurrentInstallations() {
let results;
try {
results = await installations.find({});
} catch (err) {
throw err;
}
if (results.length === 0) { throw new Error('No installations registered'); }
return results;
}
在您提供的示例中根本不需要 try
和 catch
,这是 async
函数的默认行为。
你的两个代码片段的不同之处在于第一种情况下的 throw new Error(...
将由 catch
子句处理。但由于 catch
子句出于所有实际目的都是空操作,传递,所以它并不重要。
我会这样写:
async function findCurrentInstallations() {
const results = await installations.find({});
if (results.length === 0) { throw new Error('No installations registered'); }
return results;
}
只包装 await
,只会捕获等待失败引发的错误,如果代码中的任何一行失败,包装整个事情都会失败,这取决于您想要捕获的内容。
请注意,您只是抛出了示例,这是无用的,因为应用程序在失败时无论如何都会抛出。