2009-10-01 34 views
10

Im newish to objective-c và sáng bắt đầu tự hỏi cách phổ biến/chuẩn/thích hợp để xử lý và bắt lỗi là gì?Trả về lỗi trong mục tiêu-c

Dường như có thể sử dụng NSError để làm điều này, đó là một ý tưởng hay một vụ cướp không?

Trả lời

17

Tôi khá chắc chắn đó là những gì lớp NSError có để làm - cung cấp chi tiết về lỗi. Các mô hình phổ biến nhất bạn sẽ thấy là một phương pháp mà phải mất một con trỏ đến một đối tượng NSError, như trong:

- (id)doSomethingWithArgument:(id)arg error:(NSError **)error

Phương pháp này trả về một số giá trị (hoặc có thể nil) cho kết quả làm một cái gì đó, nhưng nếu cuộc gọi không thành công sẽ đặt một đối tượng NSError tại con trỏ được thông qua với các chi tiết về sự thất bại. Tài liệu của bạn có trách nhiệm xác định những gì được trả về nếu phương pháp không gặp lỗi.

Phương pháp khác mà bạn nghĩ đến là khối @throw - @catch; Tuy nhiên, trong mục tiêu-C @throw một ngoại lệ có thể khá tốn kém tính toán, và nó thường chỉ được khuyến khích để làm như vậy trong các tình huống thực sự đặc biệt.

Chỉnh sửa: wow, hóa ra nhiều người có ý kiến ​​thực sự mạnh mẽ về @throw ing ngoại lệ. Tổng hợp (khá hữu ích) bình luận về vấn đề này:

  • ngoại lệ Throwing nên thường xuyên nhất đối phó với lỗi lập trình viên (tình huống mà nên bao giờ xảy ra, và những thứ tương tự); ngoại lệ không được sử dụng để xử lý lỗi thông thường. Thay vào đó, sử dụng phương thức error đã trình bày ở trên hoặc đăng các trường hợp NSNotification.
  • Nếu bạn sử dụng rộng rãi các khối @throw/@catch, hãy cẩn thận về logic xung quanh chúng. Mục tiêu-C cung cấp rất nhiều cách để tách các phương thức để chạy trong các chủ đề khác, hoặc trì hoãn thực hiện, vv Hãy rất cẩn thận để giải thích cho tất cả các khả năng đó khi bạn viết mã của bạn.

Cuối cùng, một điểm rất hợp lệ:

  • Nếu bạn sử dụng các đối tượng error truyền cho một phương pháp, giá trị trả về nên chỉ ra nó. Đừng cố gắng thực hiện cả hai (trả lại một đối tượng hợp lệ một phần đặt đối tượng error).
+2

Cố gắng để @throw cái gì đó sẽ bị bắt ngoài phạm vi của bạn cũng có rất nhiều vấn đề logic tinh tế trong ObjC. Ví dụ nếu bạn được gọi là NSTimer thì sao? Ai sẽ bắt ngoại lệ (và tránh bị rơi)? Ngoại lệ ObjC không đủ mạnh để xử lý các thành ngữ ObjC phổ biến. Chúng thường chỉ hữu ích để xử lý các lỗi lập trình. NSError chắc chắn là đúng cách để đi nếu bạn cần một đối tượng lỗi phong phú để sử dụng chung. –

+2

Để làm rõ, "tình huống thực sự đặc biệt" trong Cocoa hầu như luôn gây ra lỗi lập trình viên, và thường không thể phục hồi, hoặc ít nhất dễ dàng tránh được với các kiểm tra thích hợp và cần thiết. Ném một ngoại lệ chỉ để báo hiệu một cái gì đó cho lập trình viên không phải là một thực hành tốt trong Objective-C, và ngày nay nó thậm chí không được khuyến khích trong Java, không phải vì chi phí tính toán mà bởi vì nó làm tăng sự phức tạp của mã máy khách. –

+4

Tiếp tục khái niệm này, ngay cả ý tưởng xử lý lỗi tập trung có triển khai tốt hơn so với ngoại lệ trong Cocoa. Tôi thường ném lỗi trong NSNotifications được quan sát bởi một số đối tượng xử lý lỗi trung tâm để cung cấp phản hồi của người dùng. Khi kết hợp với sự đóng gói của NSError về thử lại logic, điều này có thể làm cho "đăng thông báo và trả về" một giải pháp rất hiệu quả cho các lỗi gây ảnh hưởng đến người dùng. –

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