Skip to content

Latest commit

 

History

History
47 lines (38 loc) · 1.16 KB

File metadata and controls

47 lines (38 loc) · 1.16 KB

Sự khác biệt trở nên rõ ràng khi chúng ta xem xét code bên trong một hàm.

Cách phản ứng sẽ khác nhau nếu có hành vi "nhảy ra" của try...catch.

Ví dụ, khi có một return bên trong try...catch. Mệnh đề finally hoạt động trên bất kỳ lối thoát nào khỏi try...catch, ngay cả khi thoát qua câu lệnh return: ngay sau khi try...catch kết thúc thực thi, nhưng trước khi gọi code giành quyền kiểm soát.

function f() {
  try {
    alert('bắt đâù');
*!*
    return "kết quả";
*/!*
  } catch (err) {
    /// ...
  } finally {
    alert('dọn dẹp!');
  }
}

f(); // dọn dẹp!

...Hoặc khi có một throw, như thế này:

function f() {
  try {
    alert('bắt đầu');
    throw new Error("một lỗi");
  } catch (err) {
    // ...
    if("không thể xử lý lỗi") {
*!*
      throw err;
*/!*
    }

  } finally {
    alert('dọn dẹp!')
  }
}

f(); // dọn dẹp!

finally ở đây đảm bảo việc dọn dẹp. Nếu chúng ta chỉ đặt code ở cuối hàm f, thì nó sẽ không chạy trong những tình huống này.