2010-04-06 36 views
10

OK. Tôi có thể tách tóc ở đây, nhưng mã của tôi không nhất quán và tôi muốn làm như vậy. Nhưng trước khi tôi làm, tôi muốn chắc chắn rằng tôi đang đi đúng hướng. Trong thực tế điều này không quan trọng, nhưng điều này đã làm phiền tôi trong một thời gian vì vậy tôi figured tôi muốn hỏi đồng nghiệp của tôi ...JavaScript try/catch: lỗi hoặc ngoại lệ?

Mỗi lần tôi sử dụng một tuyên bố try... catch, trong khối catch tôi luôn luôn đăng nhập một tin nhắn vào bảng điều khiển nội bộ của tôi. Tuy nhiên các thông điệp tường trình của tôi không nhất quán. Họ hoặc là giống như:

catch(err) { 
DFTools.console.log("someMethod caught an error: ",err.message); 
... 

hay:

catch(ex) { 
DFTools.console.log("someMethod caught an exception: ",ex.message); 
... 

Rõ ràng các chức năng mã đúng một trong hai cách nhưng nó bắt đầu làm phiền với tôi rằng đôi khi tôi đề cập đến "lỗi" và đôi khi để "ngoại lệ". Như tôi đã nói, có lẽ tôi đang tách tóc nhưng đó là các thuật ngữ thích hợp thích hợp? "Ngoại lệ" hoặc "Lỗi"?

+0

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

+5

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

+0

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

Trả lời

11

Đây là một chút chủ quan, nhưng với tôi, lỗi là khi ai đó hoặc điều gì đó làm sai, không đúng hoặc không hợp lệ. Nó có thể là lỗi cú pháp, lỗi logic, lỗi đọc, lỗi người dùng hoặc thậm chí là lỗi xã hội. Đó là một khái niệm trừu tượng.

Một ngoại lệ, mặt khác, là một đối tượng được tạo và ném khi một điều kiện nhất định xảy ra trong mã. Nó có thể hoặc có thể không tương ứng với một lỗi khái niệm. Vì vậy, với tôi, danh pháp thích hợp là "ngoại lệ".

+0

Tôi thích điều này - nó có ý nghĩa với tôi – Josh

+3

OK. Sau khi thảo luận về chủ đề này với một người bạn, tôi nghiêm túc xem xét chấp nhận câu trả lời này. Đây là suy nghĩ của tôi. Lấy những gì bạn nói với những gì @Pointy đã nói trong phần bình luận: bạn có thể 'ném' bất cứ thứ gì. Bất cứ thứ gì bắt được là một ngoại lệ. Nó có thể là ngoại lệ là một lỗi. Vì vậy, 'Ngoại lệ' là một thuật ngữ thích hợp. – Josh

+0

Cảm ơn. Tôi đã đạt đến giới hạn đại diện của tôi trong ngày, vì vậy bạn có thể mất nhiều thời gian tùy thích. – tloflin

0

gì bạn nhận được trong một khối Catch là một ngoại lệ, vì vậy tôi đặt tên cho nó là một ngoại lệ ...

Nếu đó là một lỗi - Tôi có thể xử lý nó trong mã của tôi & Tôi thường không mong đợi để xem nó trong khối Catch

HTH.

1

Ngoại lệ là điều bạn có thể mong đợi ví dụ trong một nỗ lực mở tệp có thể phải đối mặt với "Ngoại lệ không tìm thấy tệp". Mặt khác, lỗi là một cái gì đó bạn có thể không nhìn thấy nó đến như ngăn xếp trên dòng chảy hoặc không đủ bộ nhớ.

Một ngoại lệ là một cách hợp lý thay thế ngoài chức năng không tạo ra kết quả logic. Một ngoại lệ cũng cho phép giải thích tốt hơn về những gì xảy ra tại sao nó tồn tại theo cách này. Đối với việc mở tập tin, một lần nữa, một tập tin xử lý là một kết quả hợp lý và nếu tập tin không tồn tại (một ngoại lệ có thể) hoặc nó là một thư mục không phải là một tập tin (một ngoại lệ có thể).

+0

+1: Điều này tương tự như suy nghĩ của tôi về chủ đề này. Ngoại lệ có thể được dự kiến, lỗi có thể không. – CAbbott

+0

Vì vậy, nếu tôi hiểu bạn một cách chính xác, bạn đề nghị tôi nên đăng nhập dựa trên những gì thực sự xảy ra? Đó là, tôi xác định khi nào đó là lỗi và khi nào là ngoại lệ? IE nếu đó là một khối try/catch xung quanh một cuộc gọi AJAX thì đó là một ngoại lệ, nhưng lỗi ngoài bộ nhớ là, tốt, một lỗi? – Josh

+0

Một ngoại lệ là một cách thay thế ngoài chức năng không tạo ra kết quả logic. Một ngoại lệ cũng cho phép giải thích tốt hơn về những gì xảy ra tại sao nó tồn tại theo cách này. Đối với việc mở tập tin, một lần nữa, một tập tin xử lý là một kết quả hợp lý và nếu tập tin không tồn tại (một ngoại lệ có thể) hoặc nó là một thư mục không phải là một tập tin (một ngoại lệ có thể). Đó là loại tình huống tôi sẽ sử dụng ngoại lệ. Vì vậy, AJAX gọi nên ném ngoại lệ. :-D – NawaMan

1

Trong JavaScript, nó được gọi là Lỗi bắt. Vì vậy, tôi sẽ đề nghị bạn sử dụng lỗi thay vì ngoại lệ. Để nguyên lựa chọn ở giữa bằng cách sử dụng "e". Giống như trong các ví dụ của Mozilla. Mozilla Core JavaScript 1.5 Reference

+1

Ahhh ... nhưng http://w3schools.com/js/js_throw.asp nói "Câu lệnh ném cho phép bạn tạo ngoại lệ". – Josh

+2

w3schools là một tập hợp các hướng dẫn, chứ không phải là trang web tham khảo chính xác. –

+0

@Daniel: Cảm ơn. Điều đó làm mất uy tín câu trả lời của CSmooth.net – Josh

4

ECMAScript specification gọi chúng là ngoại lệ. Bạn có thể cũng muốn làm như vậy.

Để thực hiện khai thác gỗ của bạn nhiều thông tin hơn:

catch(ex) { 
    DFTools.console.log("someMethod caught an exception of type " 
     + ex.name + ": ", ex.message); 

Bạn cũng có thể muốn lưu ý rằng trường hợp ngoại lệ (không may) có thể là của bất kỳ loại, và do đó, không nhất thiết phải namemessage tính:

catch(ex) { 
    if (ex.message && ex.name) {   
     DFTools.console.log("someMethod caught an exception of type " 
      + ex.name + ": ", ex.message); 
    } else /* deal with it somehow */ 

Vì đây đang bắt đầu trông khá cồng kềnh để lặp lại ở khắp mọi nơi, bạn có thể muốn chụp nó trong một hàm:

function logExceptions(methodName, action) { 

    try { 

     action(); 

    } catch (ex) { 
     if (ex.message && ex.name) {   
      DFTools.console.log("someMethod caught an exception of type " 
       + ex.name + ": ", ex.message); 
     } else { 
      DFTools.console.log("someMethod caught a poorly-typed exception: " + ex); 
     } 
    } 
} 

Bây giờ bạn có thể nói:

logExceptions(function() { 

    // do some risky stuff... 

}); 
+0

HA! Trên thực tế, đặc tả ECMAScript gọi "Lỗi ngoại lệ"! – Josh

+2

Đúng, tất cả các nhà thầu ngoại lệ tiêu chuẩn đều sử dụng Lỗi thay vì Ngoại lệ ... nhưng đó là JS cho bạn! :) Nhưng đó có lẽ là vì những chức năng ngoại lệ đó được cho là chỉ ra lỗi; sử dụng ngoại lệ khác có thể không. Ví dụ, JavaScript 1.7 trong Mozilla có một phần mở rộng được gọi là "máy phát điện" sử dụng một ngoại lệ để cho biết kết thúc của một chuỗi, và loại ngoại lệ là 'StopIteration' - không đề cập đến" lỗi ", có ý nghĩa. Vì vậy, có thể có một số phương pháp để điên rồ ... –

+0

@Josh - câu trả lời của tôi ở trên là bình luận ban đầu của bạn trước khi bạn chỉnh sửa nó, trong đó bạn hỏi tại sao các nhà xây dựng ngoại lệ được xây dựng trong sử dụng từ "Lỗi". Câu trả lời mới là: bạn đang đọc thông số gì? Phiên bản tôi liên kết để đề cập đến ngoại lệ là "ngoại lệ". Nó sử dụng thuật ngữ "lỗi ngoại lệ" để chỉ cụ thể các ngoại lệ cho biết lỗi. Đó không phải là tất cả ngoại lệ. –

1

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).

Các vấn đề liên quan