2009-03-30 28 views
5

Tôi có quyền truy cập vào hệ thống phân cấp ngoại lệ của Ruby (nó được đề cập trong cả cuốc chim và chim ruồi), nhưng tôi không biết ngoại lệ nào để sử dụng vì tôi không tìm thấy bất kỳ thông tin nào của các thuật ngữ có nghĩa là.Sử dụng đúng phân lớp ngoại lệ trong ruby ​​

Có sử dụng đúng loại vấn đề ngoại lệ không?

+0

Chỉ cần xem qua mô tả về các lớp ngoại lệ tại http://redmine.ruby-lang.org/projects/ruby/wiki/ExceptionClassesDoc –

Trả lời

8

"Nó phụ thuộc".

Một trong những vấn đề chính với Ruby là thiếu thông số kỹ thuật tốt. Tuy nhiên, nó đã trở nên tồi tệ hơn.

Đây chủ yếu là câu hỏi về kiểu: Nếu lỗi của bạn có thể được mô tả tốt với một trong các lớp ngoại lệ được tạo sẵn, hãy sử dụng nó. Nếu bạn nghĩ rằng một phân lớp có ý nghĩa, hãy sử dụng nó.

Nếu không, bạn có thể xem xét để làm theo :

Tạo ngoại lệ rất công phu phân cấp là một sự lãng phí thời gian. Không ai kết thúc việc chăm sóc và mọi nỗ lực đi để lãng phí. Thay vào đó, hãy tạo một ngoại lệ cho mỗi thư viện hoặc không gian tên và có lý do ngoại lệ trong trường hợp ngoại lệ đó để cho biết loại ngoại lệ .

Ví dụ: đối với gói mã hóa hệ điều hành của bạn , hãy thực hiện một ngoại lệ được gọi là OsencapException.

+1

Thay vì tạo một ngoại lệ cho mỗi thư viện, tôi khuyên bạn nên tạo một ngoại lệ cho từng điều kiện bạn muốn bắt. Bạn có thể sử dụng một RuntimeError theo mặc định, và khi bạn phát hiện ra rằng bạn nghĩ về việc phân tích cú pháp thông báo lỗi trong một khối cứu hộ, hãy tạo một lớp mới. – Arsen7

1

số

Hoặc đúng hơn, nếu không quan trọng với bạn, thông thường không quan trọng với bất kỳ ai khác. Nếu bạn đang viết một thư viện, bạn nên sử dụng một cái gì đó mà người dùng thư viện của bạn sẽ hiểu, nhưng đó là về nó.

10

Điều quan trọng khi tạo ngoại lệ của riêng bạn. Một lưu ý quan trọng là các trường hợp ngoại lệ được thừa hưởng từ Exception thay vì sau đó StandardError (lỗi thường gặp) sẽ không bị bắt bởi cứu (không có bất kỳ đối số nào).

+8

Điều này có nghĩa là bất kỳ lớp Ngoại lệ nào bạn tạo nên luôn được kế thừa từ StandardError, không bao giờ trực tiếp từ Ngoại lệ. Tôi nghĩ bạn có thể làm điều này rõ ràng hơn một chút ... –

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