首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

no-unsafe-finally

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

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

代码语言:javascript
复制
// 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
代码语言:javascript
复制
// 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
代码语言:javascript
复制
// 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(...)
代码语言:javascript
复制
// 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定义。

此规则的错误代码示例:

代码语言:javascript
复制
/*eslint no-unsafe-finally: "error"*/
let foo = function() {
    try {
        return 1;
    } catch(err) {
        return 2;
    } finally {
        return 3;
    }
};
代码语言:javascript
复制
/*eslint no-unsafe-finally: "error"*/
let foo = function() {
    try {
        return 1;
    } catch(err) {
        return 2;
    } finally {
        throw new Error;
    }
};

此规则的正确代码示例:

代码语言:javascript
复制
/*eslint no-unsafe-finally: "error"*/
let foo = function() {
    try {
        return 1;
    } catch(err) {
        return 2;
    } finally {
        console.log("hola!");
    }
};
代码语言:javascript
复制
/*eslint no-unsafe-finally: "error"*/
let foo = function() {
    try {
        return 1;
    } catch(err) {
        return 2;
    } finally {
        let a = function() {
            return "hola!";
        }
    }
};
代码语言:javascript
复制
/*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 中引入。

资源

扫码关注腾讯云开发者

领取腾讯云代金券