SỰ TỪ BỎ CHỦ YẾU: Tôi không cho rằng đó là một câu trả lời "đúng" cho việc này. Các quan điểm thể hiện ở đây là chủ quan và cá nhân. Hơn nữa là những ý tưởng tôi sắp tán thành chỉ hữu ích nếu bạn sẽ làm những việc khác nhau với các lỗi khác nhau, ahem, ... như bạn có thể sử dụng một hệ thống theo câu trả lời thông tin của Daniel Earwicker. Với ý nghĩ đó:
Tôi cho rằng "ngoại lệ là ngoại lệ". ERROR ít bị bất ngờ hơn.
tuyên bố từ chối trách nhiệm: Mã giả sau không tốt; nó chỉ phục vụ như trường hợp tối thiểu mà tôi có thể nghĩ đến để minh họa quan điểm của tôi.
lưu ý: trong thử nghiệm tư duy này, GetFile trả về ĐÃ ĐỊNH nếu không tìm thấy tệp được chỉ định.
function AlwaysGetFile(name){
var file = null;
if(FileExists(name)){
file = GetFile(name);
if(typeof file === "undefined"){
throw new "couldn't retrieve file" EXCEPTION
}
}
else{
throw new "file does not exist" ERROR
}
return file;
}
Trong trường hợp người tiêu dùng gọi GetFileOrThrow với tên tệp không tồn tại, ERROR sẽ xảy ra. Theo tôi, sự khác biệt thực sự là mã cấp cao hơn (hoặc đầu vào của người dùng) đang làm điều gì đó sai ... chức năng này phải vượt qua một L ERI lên đường tới mã cấp cao hơn mà có thể quyết định làm gì về kết quả này. Hãy xem xét nó như thế này ... chức năng này sẽ được nói với bất kỳ chức năng tiêu thụ:
Look, my friend, I know what's going on here: it is an ERROR to request BobAccounts.xml, so don't do it again! Oh, and if you think you now know what might have gone wrong (having abused me), go ahead and try to recover from it!
Bây giờ xem xét các trường hợp đó chức năng này có tên, kiểm tra rằng các tập tin tồn tại và sau đó vì một lý do thất bại trong việc lấy nó. Đây là một tình huống khác. Một cái gì đó thực sự bất ngờ đã xảy ra. Hơn nữa, mã tiêu thụ không phải là để đổ lỗi cho. Bây giờ chúng ta thực sự muốn chức năng này để nói với bất kỳ chức năng tiêu thụ:
Oh fiddlesticks! Sorry about this, I humbly beg your pardon but something EXCEPTIONAL that I don't really understand has gone wrong. I don't think that your request for BobAccounts.xml was unreasonable... and I know I should be fulfilling it for you. Since I'm lower level code than you, I really ought to know what's going on... but I don't... and since you've less chance than me of understanding this EXCEPTIONAL situation, I think you'd probably best just stop what you're doing and let this message go all the way to the top... I mean, there is something seriously fishy going on here.
Vì vậy, tôi giả sử tóm tắt của tôi là thế này: Nếu sai sót xảy ra trong mã bậc cao (bạn có được thông qua dữ liệu xấu) ném một LỖI. Nếu sai lầm xảy ra ở mã đơn đặt hàng thấp hơn (một hàm bạn phụ thuộc vào thất bại theo cách bạn không hiểu và không thể lập kế hoạch) hãy ném một ngoại lệ ... và nếu lỗi xảy ra trong hàm bạn hiện đang viết .. Vâng, duh, nếu bạn biết về nó thì hãy sửa nó!
Và cuối cùng, để trả lời câu hỏi gốc trực tiếp hơn: Về xử lý ERRORS và EXCEPTIONS, lời khuyên của tôi sẽ là: Xử lý tất cả ERRORS một cách duyên dáng (tùy ý ghi nhật ký) ... nhưng xử lý EXCEPTIONS cẩn thận; chỉ cố gắng phục hồi từ một EXCEPTION nếu bạn thực sự chắc chắn bạn biết nó là gì và tại sao nó xảy ra, nếu không hãy để nó bong bóng lên (rethrowing nó nếu bạn phải).
Tôi luôn gọi đây là "xử lý ngoại lệ", tuy nhiên để kích hoạt khối catch bạn 'ném lỗi mới (" ... ")', vì vậy ... – Josh
Bạn có thể ném bất cứ thứ gì mình muốn - 'ném "Chào mẹ!"; 'Hoàn toàn hợp lệ. – Pointy
Có. Có lẽ tôi nên nói * Tôi * ném các đối tượng Lỗi mới hoặc các đối tượng được kế thừa từ Lỗi. – Josh