在Objective-C編程中,錯誤處理由Foundation
框架中提供的NSError
類提供處理。
與僅使用錯誤代碼或錯誤字串相比,NSError
對象封裝了更豐富且更具可擴展性的錯誤資訊。 NSError
對象的核心屬性是錯誤域(由字串表示),特定於域的錯誤代碼和包含應用程式特定資訊的用戶資訊字典。
NSError
Objective-C程式使用NSError
對象來傳達有關用戶需要瞭解的運行時錯誤的資訊。 在大多數情況下,程式會在對話框或工作表中顯示此錯誤資訊。 但它也可能會解釋資訊並要求用戶嘗試從錯誤中恢復或嘗試自行更正錯誤
NSError
對象包括 -
- 域 - 錯誤域可以是預定義的
NSError
域之一,也可以是描述自定義域和域的任意字串,不能為nil
。 - 代碼 - 錯誤的錯誤代碼。
- 用戶資訊 - 錯誤和
userInfo
的字典可能為nil
。
以下示例代碼顯示如何創建自定義錯誤 -
NSString *domain = @"com.zaixian.MyApplication.ErrorDomain";
NSString *desc = NSLocalizedString(@"Unable to complete the process", @"");
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc };
NSError *error = [NSError errorWithDomain:domain code:-101 userInfo:userInfo];
以下是作為對指針的引用傳遞的上述錯誤示例的完整代碼 -
#import <Foundation/Foundation.h>
@interface SampleClass:NSObject
-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr;
@end
@implementation SampleClass
-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr {
if(id == 1) {
return @"Employee Test Name";
} else {
NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
NSString *desc =@"Unable to complete the process";
NSDictionary *userInfo = [[NSDictionary alloc]
initWithObjectsAndKeys:desc,
@"NSLocalizedDescriptionKey",NULL];
*errorPtr = [NSError errorWithDomain:domain code:-101
userInfo:userInfo];
return @"";
}
}
@end
int main() {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
SampleClass *sampleClass = [[SampleClass alloc]init];
NSError *error = nil;
NSString *name1 = [sampleClass getEmployeeNameForID:1 withError:&error];
if(error) {
NSLog(@"Error finding Name1: %@",error);
} else {
NSLog(@"Name1: %@",name1);
}
error = nil;
NSString *name2 = [sampleClass getEmployeeNameForID:2 withError:&error];
if(error) {
NSLog(@"Error finding Name2: %@",error);
} else {
NSLog(@"Name2: %@",name2);
}
[pool drain];
return 0;
}
在上面的例子中,如果id
為1
,則返回一個名稱,否則設置用戶定義的錯誤對象。
編譯並執行上述代碼時,會產生以下結果 -
2018-11-15 13:53:52.027 main[136833] Name1: Employee Test Name
2018-11-15 13:53:52.029 main[136833] Error finding Name2: Unable to complete the process
上一篇:
Objective-C日誌處理
下一篇:
Objective-C命令行參數