01/10/2018, 08:14
Nên sử dụng if else hay try catch exception?
Mình muốn viết code, đại ý là có một List<string> list
, nếu tồn tại file list[i] thì thực hiện công việc XXX nào đó.
Theo như một bài báo mình mới được đọc, “Không có vé thì bị chặn lại là một bước tiến lớn so với nếu có vé mới được vào.” Từ ý tưởng đó, mình cho rằng
foreach (var FileName in list)
try
{
XXX(FileName);
}
catch (System.IO.FileNotFoundException)
{
xxx("File not found");
}
sẽ tốt hơn là
foreach (var FileName in list)
if (System.IO.File.Exists(FileName)
{
XXX(FileName);
}
else
{
xxx("File not found");
}
Liệu mình nghĩ như vậy có đúng không ạ? Xin mọi người cho ý kiến.
Bài liên quan
How to decide between using if/else vs try/catch?
Với file nên dùng try/catch vì sau khi bạn check file có thể biến mất.
Theo tôi, bạn nên sử dụng try/catch bên trong hàm XXX(FillName). Như sau:
hoặc là
Ưu điểm của cách này là ở YYY() bạn
Mình thấy cách hoàn toàn không sử dụng if sẽ tốt hơn là cách thứ nhất, bởi vì cái câu “Không có vé thì bị chặn lại là một bước tiến lớn so với nếu có vé mới được vào.”. Thông qua cái link của bạn mà mình đánh tích solution, mình thấy việc bỏ qua kiểm tra trước khi thực hiện bằng try catch sẽ giúp tăng tốc độ thực hiện khối câu lệnh và hạn chế lỗi
Theo mình thì điều đó không cần thiết. Vì khi thực hiện khối try - catch, nó sẽ thực hiện các lệnh nằm bên trong khối try, nếu hàm XXX đó có bị Exception thì nó cũng sẽ qua khối catch bên ngoài
Trừ trường hợp “tự làm khó mình” đây trường hợp “có thật” do mình làm ra
Hàm
XXX(Config config)
: kết nối CSDL SQLite sử dụng đối tượngconfig
Hàm
YYY()
: đọcconfig
từ fileChạy hàm
YYY()
với trường hợp muốn đọc file config có sẵn và không có file temp (đối tượng config lúc này sẽ lànull
) . Sau đó chạy tiếp hàmXXX(config)
với mộtconfig = null
, nó sẽ qua khối catch của hàmXXX
và thực hiện câu lệnhConsole.WriteLine(e.ToString());
: in ra messageNullReferenceException
ra màn hình console. Sau đó… thoát ra khối catch của hàmXXX
và tiếp tục chạy trong khối try của hàmYYY
! (đó là điều không mong muốn)Quy trình như sau:
Vì thế đừng try - catch hay throw ra Exception trong các hàm con làm gì. Thêm rắc rối và khó sửa
Hay nói cách khác, tránh để các utility function bắt 1 exception (?)
Nếu sử dụng log thì chưa hẳn.
Cá nhân mình thì cái gì “if else” được thì “if else”, chừng nào không được thì mới “try catch”. Tóm lại là han chế dùng “try catch” tối đa.
Lý do là nó làm chậm chương trình.
Vậy trường hợp trên mình sẽ làm như sau:
Đồng ý
Nếu trường hợp đó mình biết các tình huống xẩy ra thì nên dùng if - else
Còn nếu với hàm có rủi ro bị exception cao (như truy vấn CSDL) thì phải try - catch
try-catch khi kết nối với CSDL thôi phải ko b, chứ khi truy vấn vẫn phải dùng try-catch à.
Giả sử m có câu truy vấn
Nếu có lỗi thì isNameExist = null hay crash chương trình
Vấn đề là không phải lúc nào truy vấn cũng thành công. Kết quả chỉ trả về null nếu truy vấn thành công và CSDL không có bản ghi phù hợp. Nếu trong quá trình trao đổi, 2 máy bị mất kết nối với nhau thì chương trình sẽ bị crash nếu không có try-catch.
Vậy csdl và app chạy cùng 1 máy thì vẫn phải dùng try catch để đam bảo ko bị crash sao ? Có cồng kềnh quá ko?
À ừ tất nhiên nếu cùng một máy thì khả năng lỗi là thấp (nhưng vẫn có thể có nhé), nếu cảm thấy an toàn thì không cần try catch. Nhưng mà phần lớn truy cập là qua mạng mà?
App server phải lấy ra từ database rồi mới truyền qua mạng mà, nên việc truy vấn CSDL cũng coi như từ 1 máy tính mà thôi.
java các ide tự sinh try catch hết rồi nếu nó thấy đoạn nào nghi nghi nên thôi vấn đề này ko phải lo:v
Thần thánh vậy sao @@.
vd các đoạn đọc ghi file trong c# mà ko tự viết try catch thì ko có còn bên java là ide vd như hồi em học là netbean nó tự sinh hết anh à
Cũng 1 thời gian dùng netbeans có thấy nó sinh ra đâu nhỉ @@.
bác ấn vào cái biểu tượng vàng vàng ấy là nó tự sinh cho mình mà
Tưởng nó tự động chèn @@.