Ton*_*ony 5 cocoa objective-c nserror
在Cocoa和Objective C中,管理错误的最喜欢的方法似乎是使用一个NSError *对象,但是构造一个错误对象,我们需要调用以下方法
+ (id)errorWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dict
Run Code Online (Sandbox Code Playgroud)
我的问题是,在整个应用程序中管理错误域,错误代码定义和用户信息字典的一些最佳实践是什么,以便错误代码,域和用户信息字典始终保持一致?
jus*_*tin 11
如果你有大量的错误构造,你可以通过使用一个类来简化你的生活.我实际上使用C++这样可以删除程序不需要的调用(与objc不同),但你可以使用C,ObjC或C++:
MONErrorDomain.h
// you won't normally need an instance here
@interface MONErrorDomain : NSObject
+ (NSString *)domain; // << required override
- (NSString *)domain; // << returns [[self class] domain]
// example convenience methods:
// uses [self domain]
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode; // << user info would be nil
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode userInfo:(NSDictionary *)userInfo;
@end
Run Code Online (Sandbox Code Playgroud)
MONKoalaError.h
@interface MONKoalaError : MONErrorDomain
+ (NSError *)outOfEucalyptus;
@end
extern NSString * const MONKoalaErrorDomain;
typedef enum MONKoalaErrorCode {
MONKoalaErrorCode_Undefined = 0,
MONKoalaErrorCode_OutOfEucalyptus
} MONKoalaErrorCode;
Run Code Online (Sandbox Code Playgroud)
MONKoalaError.m
// apple recommends we use reverse domains
NSString * const MONKoalaErrorDomain = @"com.mon.koala-library.MONKoalaErrorDomain";
@implementation MONKoalaError
+ (NSString *)domain
{
return MONKoalaErrorDomain;
}
+ (NSError *)outOfEucalyptus
{
NSDictionary * info = …;
return [self errorWithErrorCode:MONKoalaErrorCode_OutOfEucalyptus userInfo:info];
}
@end
Run Code Online (Sandbox Code Playgroud)
然后,每个域的错误创建都集中在一个位置,客户端可以轻松选择错误,而无需手动构建错误:
if (outError) {
*outError = [MONKoalaError outOfEucalyptus];
}
Run Code Online (Sandbox Code Playgroud)
和错误处理采取以下形式:
if ([e.domain isEqualToString:MONKoalaErrorDomain]) {
switch (e.code) {
case MONKoalaErrorCode_OutOfEucalyptus : {
self.needsEucalyptus = true;
…
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5667 次 |
| 最近记录: |