Tôi sẽ đưa ra một câu trả lời hơi khác ở đây: Có, cả khối try
và finally
khối đều được thực thi và finally
được ưu tiên hơn giá trị "trả về" thực tế cho một hàm. Tuy nhiên, những giá trị trả về này không phải lúc nào cũng được sử dụng trong mã của bạn.
Đây là lý do tại sao:
- Ví dụ dưới đây sẽ sử dụng
res.send()
từ Express.js, tạo một phản hồi HTTP và gửi nó đi.
- Khối của bạn
try
và finally
khối sẽ thực thi chức năng này như sau:
try {
// Get DB records etc.
return res.send('try');
} catch(e) {
// log errors
} finally {
return res.send('finally');
}
Mã này sẽ hiển thị chuỗi try
trong trình duyệt của bạn. CŨNG CÓ, ví dụ sẽ hiển thị lỗi trong bảng điều khiển của bạn. Các res.send()
chức năng được gọi là hai lần . Điều này sẽ xảy ra với bất kỳ thứ gì là một hàm. Khối try-catch-final sẽ làm xáo trộn thực tế này với con mắt chưa được đào tạo, bởi vì (cá nhân tôi) tôi chỉ liên kết return
các giá trị với phạm vi chức năng.
Đặt cược tốt nhất của bạn là không bao giờ sử dụng return
bên trong một finally
khối . Nó sẽ làm phức tạp mã của bạn và có khả năng che dấu lỗi.
Trên thực tế, có một quy tắc kiểm tra mã mặc định được thiết lập trong PHPStorm đưa ra "Cảnh báo" cho điều này:
https://www.jetbrains.com/help/phpstorm/javascript-and-typescript-return-inside-finally-block.html
Vậy bạn dùng finally
để làm gì?
Tôi sẽ finally
chỉ sử dụng để dọn dẹp những thứ. Bất kỳ thứ gì không quan trọng đối với giá trị trả về của một hàm.
Nó có thể có ý nghĩa nếu bạn nghĩ về nó, bởi vì khi bạn phụ thuộc vào một dòng mã bên dưới finally
, bạn đang giả định rằng có thể có lỗi trong try
hoặc catch
. Nhưng 2 cuối cùng là khối xây dựng thực tế của việc xử lý lỗi. Chỉ cần sử dụng một return
trong try
và catch
thay thế.