Tôi sẽ đưa ra một câu trả lời hơi khác ở đây: Có, cả khối tryvà finallykhố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
tryvà finallykhố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 trytrong 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 returncá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 returnbên trong một finallykhố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ẽ finallychỉ 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 tryhoặ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 returntrong tryvà catchthay thế.