2013-04-11 27 views
5

Tôi đã bỏ qua xử lý ngoại lệ đủ lâu, chủ yếu là bởi vì tôi không bao giờ nhìn thấy nó được sử dụng trong các đoạn tôi thấy trên SO, 2 năm viết javascript và tôi thậm chí không biết javascript đã xử lý ngoại lệ. Các ngôn ngữ khác nó là rất phổ biến để xem xử lý ngoại lệ, là ngoại lệ xử lý ít quan trọng để javascript? Một số trường hợp điển hình là một trong những nên luôn luôn sử dụng xử lý ngoại lệ trong javascript và không nên?Tôi có nên luôn bọc mã trong các khối Thử Catch cho Javascript không?

Quy tắc này có áp dụng cho javascript không?

Why should I not wrap every block in "try"-"catch"?

+1

Giả sử bạn đã bao bọc mọi khối trong thử/nắm bắt: khối catch của bạn thực sự sẽ làm gì với các ngoại lệ? – nnnnnn

+0

@nnnnnn sẽ không tránh gặp sự cố khi toàn bộ tập lệnh đủ hữu ích? Tôi thấy một số thử bắt khối trong mã jQuery UI 'với khối catch, vì vậy tôi giả định đó là một mục đích để gói tất cả các mã? –

+1

Điểm của tôi là suy nghĩ về những gì sẽ xảy ra hoặc sẽ xảy ra sau khi ngoại lệ và chắc chắn mã theo đó. "Tránh làm rơi toàn bộ tập lệnh" không thực sự hữu ích nếu ngoại lệ xảy ra trong nửa đầu nhưng nửa thứ hai sẽ không hoạt động nếu không có kết quả hợp lệ từ nửa đầu. Và một số trường hợp ngoại lệ có thể hoàn toàn tránh được bằng cách mã hóa chính xác ngay từ đầu - tôi không nói bạn sẽ làm điều này, nhưng tôi đã thấy nhiều mã nơi tác giả viết mã tinh ranh và sau đó gói nó trong một lần thử chặn để tránh cho phép người dùng thấy các lỗi có thể tránh được. – nnnnnn

Trả lời

3

Chiến lược phổ biến nhất trong javascript là viết phòng thủ và kiểm tra kỹ lưỡng.

ví dụ: có thư viện mà bắt đầu từ một hình vuông với thử nghiệm tương tự như:

var element; 

if (document && document.getElementById) { 
    element = document.getElementById('foo'); 
} 

if (element) { 
    // use element 
}  

nhưng viết bằng một định dạng chung chung hơn với các xét nghiệm như isHostMethod.

Sử dụng thử..catch chỉ là phương sách cuối cùng để phát hiện tính năng hoặc phòng thủ khác không có sẵn. Việc kiểm tra đối tượng lưu trữ đôi khi trả về kết quả vô dụng hoặc thậm chí có thể ném lỗi (ví dụ: tất cả các tập lệnh XMLHttpRequest sử dụng try..catch vì thử nghiệm hỗ trợ trong IE là không thể kết luận để lựa chọn duy nhất là chỉ gọi nó và xem điều gì xảy ra).

Lỗi tập lệnh nhỏ không có nhiều vấn đề vì hầu hết các trình duyệt sẽ không hiển thị chúng theo mặc định. Hầu hết các trang không tầm thường đều bị lỗi tất cả thời gian (bao gồm SO) tùy thuộc vào những thứ như trình duyệt, cài đặt và môi trường mạng của người dùng. Người dùng chỉ bị từ chối chức năng mà họ có thể hoặc có thể không nhận thức được họ đang thiếu (và thực sự có thể hưởng lợi từ). Do đó, một chiến lược điển hình là làm cho chúng ta trang chức năng mà không cần bất kỳ tập lệnh nào, sau đó thêm các tính năng tập lệnh để nâng cao khả năng sử dụng. Bằng cách đó, luôn có một dự phòng cho chức năng cơ bản nếu xảy ra lỗi có thể ngăn trang hữu ích.

Chiến lược này có thể không phải lúc nào cũng có thể, nhưng đó là điểm khởi đầu tốt và không nên bỏ qua một cách nhẹ nhàng.

0

Ngoại lệ là một vấn đề lớn nếu trường hợp là hiệu suất. Nhưng nó phát hiện lỗi theo cách rất dễ dàng.

Nếu đang sử dụng một số công cụ ném ngoại lệ thì bạn nên chạy chúng thông qua khối try catch.

Cố gắng giảm thiểu ném ngoại lệ khi mã hóa javascript

1

Trong C, bạn nên luôn kiểm tra mã trả lại.

Sau đó, đến C++ với ngoại lệ. Một Java đã thực sự sử dụng nặng nề của chúng, thậm chí quá nặng (ví dụ: Integer.parseInt: ngay cả khi bạn chỉ muốn kiểm tra, nếu một cái gì đó là String, bạn vẫn phải xử lý ngoại lệ).

JavaScript có khái niệm xử lý ngoại lệ khác. Thực tiễn tốt là cung cấp một số gọi lại gọi để xử lý ngoại lệ. Bộ chọn jQuery vẫn 'hoạt động' nếu không tìm thấy phần tử nào, bạn chỉ nhận được bộ chọn 0 phần tử.

Vì vậy, nếu bạn đang sử dụng mã để ném ngoại lệ, bạn phải xử lý nó. Nhưng bạn nên tránh ném ngoại lệ và hỗ trợ xử lý lỗi thông qua callbacks.

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