no-unsafe-finally

禁止 finally 块中的控制流语句

Disallow control flow statements in finally blocks

GoQmd2Q6MNHFvqs3M7anZBAWjBJlfqJ5GDhlTCeaxO62xTPkIT3ZJOHaWSYr3UP3fEhKUX5VBiLSottxqq7C57eaaZaC43fY0QzrSiJcBMpLlYSN1cXsmJX0oiJNneUd1qXd8/7xR4URazhpWnIITy4E68gxKTmmp+ytP3aSLyIcQXUxnUGIWsmZS0onDZwJAsznHe6F0OQtBFEFHK4fdAt3CN1z5BOk+Q/4rEa9/tY9Gfp3ivNmy20kF/qWuVHnzWdKgK+ojzfOQCWT3i9Rs0RLS8PW/CSKk1H9vB+Lom2Qc4ViTnTRmnNW2BTU0CrRGdOwngyod+UT+T7ETqsySb5dfHqN5oatlNHgKMb9/WoqIsjTvLZtm36XsuGOutQK3rD+lTL7cs3Nt8HyAuFonFU+j6heCxD2J1Hj7Se6o7w=

R8ZKo50xIx/GAuzvwAq3NWsmBeO2vb0+i/8lKwO1FmQ53BcZmr5y5JFB7LLfvPWKAtcySWXx/s2fTWEi6TKP4KJmy4XcqVpk0BMYKpRvcISsyUGnBM0QeHCYfMT4F0CV7EcePvlCMabQymi5PrqElzBuxR8FA25szOv5BEKtcALHUAk3YtBU/hFYixJn0jg11zzL/YeerI7zoxh7yOJ5sVocyDxsj7ZiHh83g97DYQ5f7WzI9z5/UFBJfofK5z1qgLQQUonG0YvTL6ymJj/OA5HkpCAtx7AxQXhqD5X7fup7GIWcFqukB5XbomrTxV/1hVZLTc87MOG7NyGOTGrWAOfW1eFMkm5oWv1JTXKCqyluG1KEq4N3BmZZfYbLjmJgx8OEf2hn/SIRNDG/be+WRbI3cKxjENKOvgebFSxypLRgjMrYP++pC2blJ1mooNRw8Bp+q//HhWNeiJch5gT0//MgeUsclhz6fdf42RNGmmDlRozNqg7c3BblzNHxRcrzoOOQBM1vFzG5+VkIw2D8RjNOct00SQ4Uqcs5HmYgYxlNBcxo+vRRi69JxuQk4hbuh3e7hBMgk/bSfrCnfA7EGVWQghtde8VvbIn6KWzCgE1FWP6VIH20O7tSXCIXLkkB/uhvsWJelnG2J1rAGPDspzjhVBLrhbpsCa0b8kAhyhX6P+SWo9pWTvdhZl6rWPqIJI1HUWCZGDnrP8r3wEc4HOMNIwMS2N1O3p4gt4V1psL6PekV9j5xPUrGq/IaICMzg89zz4Hv2k5NzOBe7KmW98y7cvnKniR63OA8E6gXGFhb60i2OYzQ01qMvW0hadGLTK3HhxRrf7qMSRPfHwF4zsnTZRTNc0GRZhOQMkwt508BOzgHF64xhwdgE61kfyk1HAaR7RY+BI3WprAZZgPDLX05sgEfaOSoH9a6YD51qSrzdSKcUApBQWlDMxdNtiGADDpmjHkBQipQ+rsOSf/2Zj8/nyDaSKqKUsE2nSNm82P/AFAsrpTOIifg8EanjmcEQG13jSDy5p5XTvmE1PgenyfxUOVmB8ujQ+1OKJ4IBWofj9Nfb4aK/pPdH7e3JhI50UA2HLpca0VFcyExasEb/iwr5dQAJ5YWmPsCTpHtBd0=

// 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; // 0 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