Eslint
规则 | Rules

no-unsafe-finally

disallow control flow statements in finally blocks (no-unsafe-finally)

"extends": "eslint:recommended"配置文件中的属性启用此规则。

JavaScript 挂起trycatch阻塞的控制流程语句,直到块的执行finally完成。所以,当returnthrowbreak,或continue在使用finally,内部控制流语句trycatch被覆盖,这被认为是意外的行为。如:

// We expect this function to return 1; (() => { try { return 1; // 1 is returned but suspended until finally block ends } catch(err) { return 2; } finally { return 3; // 3 is returned before 1, which we did not expect } })( // > 3

// We expect this function to throw an error, then return (() => { try { throw new Error("Try" // error is thrown but suspended until finally block ends } finally { return 3; // 3 is returned before the error is thrown, which we did not expect } })( // > 3

// We expect this function to throw Try(...) error from the catch block (() => { try { throw new Error("Try") } catch(err) { throw err; // The error thrown from try block is caught and rethrown } finally { throw new Error("Finally" // Finally(...) is thrown, which we did not expect } })( // > Uncaught Error: Finally(...)

// We expect this function to return 0 from try block. (() => { label: try { return 0; // 1 is returned but suspended until finally block ends } finally { break label; // It breaks out the try-finally block, before 0 is returned. } return 1; })( // > 1

规则细节

这条规则不允许returnthrowbreak,和continue里面的语句finally块。它允许间接使用,如in functionclass定义。

此规则的错误代码示例:

/*eslint no-unsafe-finally: "error"*/ let foo = function() { try { return 1; } catch(err) { return 2; } finally { return 3; } };

/*eslint no-unsafe-finally: "error"*/ let foo = function() { try { return 1; } catch(err) { return 2; } finally { throw new Error; } };

此规则的正确代码示例:

/*eslint no-unsafe-finally: "error"*/ let foo = function() { try { return 1; } catch(err) { return 2; } finally { console.log("hola!" } };

/*eslint no-unsafe-finally: "error"*/ let foo = function() { try { return 1; } catch(err) { return 2; } finally { let a = function() { return "hola!"; } } };

/*eslint no-unsafe-finally: "error"*/ let foo = function(a) { try { return 1; } catch(err) { return 2; } finally { switch(a) { case 1: { console.log("hola!") break; } } } };

何时不使用它

如果您想允许finally块中的控制流操作,则可以关闭此规则。

版本

该规则在 ESLint 2.9.0 中引入。

资源