2012-03-13 26 views
5

Tôi đã học được rằng Mục tiêu C có cách xử lý tương đương các ngoại lệ như C# thực hiện trong .NET. Ngoài các tài liệu táo nói, tôi muốn xử lý/xử lý các ngoại lệ, tạo một đối tượng NSError. Xem xét kỹ phần "Bắt các loại ngoại lệ khác nhau" trong tài liệu exception handlingCách tiếp cận chính xác để xử lý ngoại lệ trong iOS là gì?

.... Tôi muốn nắm bắt các loại ngoại lệ khác nhau. Trong .NET Tôi đang sử dụng để duyệt tài liệu của một lớp-phương thức để có được các ngoại lệ có thể nó có thể nâng cao. Nơi lấy thông tin này từ tài liệu táo? Làm cách nào để biết, loại ngoại lệ nào mà một đối tượng/đối tượng/quy trình có thể tăng?

cảm ơn vì lời đề nghị của bạn

Tom

Trả lời

5

Như tài liệu của Apple cho biết, hầu hết các trường hợp ngoại lệ được ném trong trường hợp ngoại lệ. (Một số trường hợp ngoại lệ không phải là, chẳng hạn như truy cập một đối tượng ngoài ranh giới của NSArray.)

.NET khuyến khích xử lý ngoại lệ địa phương. Ca cao được viết để khuyến khích xử lý ngoại lệ phạm vi rộng. Lý do bạn có xử lý ngoại lệ cục bộ trong .NET là bạn mong đợi một vài phần thất bại theo cách mong đợi (như lỗi mạng khi tải xuống một thứ gì đó). Trong Cocoa, điều này được xử lý bằng cách sử dụng các phương thức trả về NSErrors. Đó là điều tương tự, chỉ hiển thị nhiều hơn trong chữ ký phương thức.

Nguyên tắc chung là Cocoa chỉ ném ngoại lệ trong các trường hợp không rõ cách bạn sẽ khôi phục. (Đừng nhầm lẫn điều này cho các trường hợp ngoại lệ được ném khắp nơi như trong .NET là điều này khó xử lý.)

+0

cảm ơn thông tin bạn đã nhập! – Tom

2

Nhìn vào developer reference for exception handling. Trong ca cao, chúng tôi không có ngoại lệ như nilArgumentException, Chúng tôi chỉ nhận được NSException. Để cung cấp thông điệp hoặc xử lý hạt mịn, bạn có thể làm như sau,

if ([[exception name] isEqualToString:MyAppException]) 

Dưới đây là danh sách Tên ngoại lệ được xác định trong tệp tiêu đề NSException.

FOUNDATION_EXPORT NSString * const NSGenericException; 
FOUNDATION_EXPORT NSString * const NSRangeException; 
FOUNDATION_EXPORT NSString * const NSInvalidArgumentException; 
FOUNDATION_EXPORT NSString * const NSInternalInconsistencyException; 

FOUNDATION_EXPORT NSString * const NSMallocException; 

FOUNDATION_EXPORT NSString * const NSObjectInaccessibleException; 
FOUNDATION_EXPORT NSString * const NSObjectNotAvailableException; 
FOUNDATION_EXPORT NSString * const NSDestinationInvalidException; 

FOUNDATION_EXPORT NSString * const NSPortTimeoutException; 
FOUNDATION_EXPORT NSString * const NSInvalidSendPortException; 
FOUNDATION_EXPORT NSString * const NSInvalidReceivePortException; 
FOUNDATION_EXPORT NSString * const NSPortSendException; 
FOUNDATION_EXPORT NSString * const NSPortReceiveException; 

FOUNDATION_EXPORT NSString * const NSOldStyleException; 

SỬA CHỮA:

Bạn có thể phân lớp lớp NSException, như đề xuất tại một trong những ý kiến ​​dưới đây, để bắt ngoại lệ tùy chỉnh.

+1

Không có gì để ngăn bạn phân lớp NSException và bắt các loại cụ thể trong khối '@ catch' cho mã của riêng bạn. –

+0

cảm ơn câu trả lời của bạn – Tom

+0

@GrahamLee. Bạn rất đúng. Bạn chắc chắn có thể mở rộng. Cũng bắt đầu theo dõi blog của bạn :) – Vignesh

5

Xử lý lỗi trong thế giới Objective C có lẽ khác với những gì bạn đang sử dụng . Để đặt nó ngay, hãy quên đi các ngoại lệ. Hầu hết các lỗi được xử lý bởi các giá trị trả lại hoặc bằng cách đi qua một con trỏ đến NSError*:

NSErrror *error = nil; 
BOOL success = [somebody doSomethingWithError:&error]; 
if (!success) { 
    NSLog(@"Got error: %@", error); 
} 

Và ở phía bên callee:

- (BOOL) doSomethingWithError: (NSError**) error 
{ 
    error = error ? error : &(NSError*){ nil }; 
    if (somethingWentWrong) { 
     *error = [NSError …]; 
     return NO; 
    } 
    // All is fine 
    return YES; 
} 

này trông cồng kềnh, nhưng trong thực tế nó chủ yếu là hoạt động tốt. Trong trường hợp hiếm hoi mà một cái gì đó thực sự có thể ném một ngoại lệ (như [NSFileHandle writeData:]), tài liệu đề cập đến thực tế, nhưng tôi không nghĩ rằng bạn được dự kiến ​​sẽ phân tích ngoại lệ nhiều như thông thường trong các ngôn ngữ khác.

+0

Hi zoul, cảm ơn câu trả lời của bạn. chỉ cho việc tái định hướng của riêng tôi-> điều này có nghĩa là thực hành tốt sẽ xây dựng một khối try & catch proforma xung quanh tất cả các mã trong dự án của tôi (trong trường hợp tôi quên xử lý một cái gì đó chính xác giống như kiểm tra giá trị null) để ngăn chặn phần mềm bị lỗi. và nếu không tôi sẽ tiếp tục phát triển tốt và đừng lo lắng về việc xử lý ngoại lệ nữa? -hoặc chỉ xây dựng thử và chặn xung quanh phương pháp chính của tôi, bởi vì ngoại lệ chưa được giải quyết sẽ kết thúc ở đó (và sau đó ghi nhật ký hoặc hiển thị thông báo cho người dùng) – Tom

+0

Các đối tượng "Null" được xử lý khác nhau trong Mục tiêu- C, nó là hợp pháp để gửi một tin nhắn đến một đối tượng 'nil'. Đó là đôi khi một người tiết kiệm thời gian tốt đẹp và đôi khi một lỗi tốt đẹp đang chờ xảy ra. Bạn hầu như có thể quên đi các khối try/catch trong Objective-C. Bất cứ khi nào bạn gọi một cái gì đó có thể thất bại, hãy xem làm thế nào lỗi sẽ được trả lại. Trong hầu hết các trường hợp, bạn sẽ nhận được một 'NSError' trở lại, do đó rõ ràng từ chữ ký phương thức. Trong một số ít trường hợp còn lại, tài liệu sẽ cho bạn biết rằng phương thức có thể bị ném, vì vậy bạn sẽ cần một khối try/catch ở đó. Một lần nữa, tình huống như vậy là rất hiếm. – zoul

+0

cảm ơn cho đầu vào của bạn, chúc mừng! – Tom

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