2009-09-08 18 views
20

Đây là một câu hỏi rộng, nhưng đó là câu hỏi mà tôi tiếp tục gặp khi lập trình trong Ruby. Tôi đến từ phần lớn nền C và Java, khi tôi sử dụng hàm hoặc phương thức thư viện, tôi xem tài liệu và xem nó sẽ trả về lỗi gì (thường là trong C) hoặc ngoại lệ nào nó có thể ném (bằng Java).Làm thế nào để đối phó với không biết những gì ngoại lệ có thể được nâng lên bởi một phương pháp thư viện trong Ruby?

Trong Ruby, tình hình có vẻ hoàn toàn khác. Bây giờ tôi cần phải phân tích cú pháp một số JSON tôi nhận được từ máy chủ:

data = JSON.parse(response) 

Điều đầu tiên tôi nghĩ sau khi viết mã này là gì, nếu đầu vào xấu? Có phải parse sẽ trả về lỗi không, hoặc tăng một số ngoại lệ, và nếu có, ngoại lệ nào?

tôi kiểm tra tài liệu (http://flori.github.com/json/doc/JSON.html#M000022) và xem, chỉ cần:

"Phân tích các nguồn chuỗi JSON thành một cấu trúc dữ liệu của Ruby và gửi lại."

Đây chỉ là ví dụ về mẫu mà tôi đã chạy liên tục trong Ruby. Ban đầu, tôi nhận ra đó là một số thiếu sót trong tài liệu của bất kỳ thư viện nào tôi đang làm việc, nhưng bây giờ tôi bắt đầu cảm thấy đây là thực hành tiêu chuẩn và tôi đang có một suy nghĩ hơi khác so với các lập trình viên Ruby. Có một số quy ước tôi không biết?

Nhà phát triển giải quyết vấn đề này như thế nào?

(Và có, tôi đã xem xét mã của phương pháp thư viện và có thể biết một số ngoại lệ được nêu ra nhưng tôi không chắc chắn 100% và nếu nó không được ghi lại thì tôi cảm thấy không thoải mái khi dựa vào nó.)

EDIT: Sau khi xem xét hai câu trả lời đầu tiên, hãy để tôi tiếp tục ví dụ phân tích JSON từ trên cao.

tôi nghi ngờ tôi không nên làm:

begin 
    data = JSON.parse(response) 
    raise "parse error" if data.nil? 
rescue Exception => e 
    # blahblah 
end 

vì tôi có thể nhìn vào mã/kiểm tra và thấy có vẻ như để nâng cao một ParserError về lỗi (trở về con số không dường như không phải là phương thức chuẩn trong Ruby). Tôi sẽ đúng khi nói thực hành được đề nghị là làm:

begin 
    data = JSON.parse(response) 
rescue JSON::ParserError => e 
    # blahblah 
end 

... dựa trên những gì tôi học được về ParserError bằng cách nhìn qua mã và kiểm tra?

(Tôi cũng thay đổi nội dung các ví dụ để làm rõ nó là một phản ứng từ một máy chủ mà tôi đang phân tích cú pháp.)

Trả lời

9

(Và có, tôi đã xem xét mã của phương pháp thư viện và có thể nhận ra một số ngoại lệ được nêu ra nhưng tôi không thể chắc chắn 100% và nếu nó không được ghi lại thì tôi cảm thấy không thoải mái khi dựa vào nó.)

Tôi khuyên bạn nên xem xét các bài kiểm tra, vì chúng sẽ hiển thị một số kịch bản "có khả năng" và những gì có thể được nâng lên.Đừng quên rằng các bài kiểm tra tốt cũng là tài liệu.

+1

đồng ý, viết tất cả các thông số/kiểm tra có thể cho dữ liệu đầu vào của bạn vào phương pháp của bạn và phát triển ứng dụng của bạn để quản lý các ngoại lệ đó. – Jirapong

+0

Đây là một điểm tốt, và tôi sẽ xem xét các bài kiểm tra từ bây giờ. – user85509

2

Bạn không bao giờ có thể chắc chắn những gì trường hợp ngoại lệ có thể được nâng lên, trừ khi mã thư viện bắt tất cả và sau đó kết thúc tốt đẹp cho họ . Đặt cược tốt nhất của bạn là giả sử đầu vào tốt từ mã của bạn bằng cách khử trùng những gì đi vào và sau đó sử dụng xử lý ngoại lệ cấp cao hơn của riêng bạn để nắm bắt đầu vào xấu từ đầu vào của bạn.

+0

Tôi không nghĩ điều này là thực tế. Trong trường hợp cụ thể này, tôi đang phân tích cú pháp phản hồi từ máy chủ. Trong trường hợp hiếm hoi mà máy chủ gửi cho tôi dữ liệu xấu, tôi muốn ít nhất có thể thất bại một cách duyên dáng và nói "phản hồi xấu từ máy chủ". – user85509

+0

Trong trường hợp này, bạn cần phải nắm bắt ngoại lệ chung từ phương pháp này và reraise với thông điệp thích hợp. –

4

Tôi đoán rằng nếu không có tài liệu được cung cấp, bạn phải dựa vào một cái gì đó như thế này:

begin 
    # code goes here 
rescue 
    # fail reason is in $! 
end 
4

Nếu bạn muốn loại bỏ dữ liệu JSON không hợp lệ:

begin 
    res = JSON.parse(string) 
rescue JSON::ParserError => e 
    # string was not valid 
end 
Các vấn đề liên quan