giả sử thế này, bạn mở 1 file có dữ liệu là số. nếu file thành công, bạn parse data trong file đó thành số và trả về số trong file đó.
nếu chẳng may file đó có dữ liệu không phải là số -> bạn muốn throw exception cho người dùng.
và quan trọng là bạn không muốn file được close cho tới khi người dùng biết được việc file này thành công hay thất bại.
giả sử file luôn tồn tại nên mình sẽ bỏ qua đoạn mở file
var f = openFile("abc.data", "r")
var data = f.read();
try {
var value = tryParse(data);
return value;
} catch (Exception e) {
throw e;
}
câu hỏi đặt ra là, làm sao bạn có thể đóng cái file f
sau khi return?
thì khi này finally sẽ giúp bạn làm điều đó.
var f = openFile("abc.data", "r")
var data = f.read();
try {
var value = tryParse(data);
return value;
} catch (Exception e) {
throw e;
} finally {
f.close();
}
chung quy, finally thường sẽ giúp bạn dọn dẹp các đoạn code trong khối try-catch, sau khi xong việc. việc dọn dẹp có thể là đóng file, đóng connection, v.v
và mình đọc code thì “thường” thấy nó được đặt ở cuối hàm nhằm để dọn dẹp 1 hàm luôn.
lưu ý là finally “thường” được dùng như vậy, chứ không phải luôn luôn.
và vì finally thường là để “dọn dẹp”, nên nếu phần try-catch của bạn ở nằm ở giữa 1 hàm. lấy ví dụ trên, bạn lấy con số đó ra và cộng trừ nhân chia chẳng hạn. bạn không cần dọn dẹp gì thì bạn không cần finally cũng được.
chung quy khi bạn xài finally, hãy nghĩ rằng bạn muốn hay không chạy 1 đoạn code sau khối try-catch bất kể là try hay catch.
nếu có -> bạn hỏi tiếp là bạn có thể đặt đoạn code đó sau khối try-catch được không? như thế này
try {
...
} catch (...) {
...
}
// code sau try-catch ở đây
nếu được? thì bạn vứt ở sau đó cũng được.
còn nếu không -> xài finally
block
try {
...
} catch (...) {
...
}
// code sau try-catch ở đây không được,
// vì ở trong try-catch có return, hàm sẽ kết thúc :/
->
try { ... }
catch (...) { }
finally { ... }