正しい方法は、NSError
エラーが発生する可能性のあるすべてのメソッドで自分自身を直接使用することです。最近、作成したユーティリティクラスを使用してこれを実行しましたが、非常にうまく機能します。次に、アプリケーションがエラー(クラッシュ、ログ、その他)をどう処理するかを決定できるようにし、フレームワークは心配する必要がありません。
エラーオブジェクトを作成するために使用したプライベートクラスメソッドを次に示します。これにより、基になるPOSIXエラー(errno
など)が可能になります。
#pragma mark - Private Methods
- (NSError *)error:(NSString *)localizedDescription
code:(EZipFileError)code
underlyingError:(NSError *)underlyingError
{
NSMutableDictionary *errorDetail = [NSMutableDictionary dictionary];
[errorDetail setValue:localizedDescription forKey:NSLocalizedDescriptionKey];
if (underlyingError != nil)
{
[errorDetail setValue:underlyingError forKey:NSUnderlyingErrorKey];
}
return [NSError errorWithDomain:@"MyErrorDomain"
code:(NSInteger)code
userInfo:errorDetail];
}
- (NSError *)error:(NSString *)localizedDescription
code:(EZipFileError)code
{
return [self error:localizedDescription
code:code
underlyingError:nil];
}
- (NSError *)error:(NSString *)localizedDescription
code:(EZipFileError)code
posixError:(int)posixError
{
NSMutableDictionary *underlyingErrorDetail = [NSMutableDictionary dictionary];
[underlyingErrorDetail setValue:[NSString stringWithUTF8String:strerror(posixError)]
forKey:NSLocalizedDescriptionKey];
NSError *underlyingError = [NSError errorWithDomain:NSPOSIXErrorDomain
code:posixError
userInfo:underlyingErrorDetail];
return [self error:localizedDescription
code:code
underlyingError:underlyingError];
}
これは次のように使用されます。
if (![self isOpen])
{
if (error != NULL)
{
*error = [self error:@"File is not open"
code:ErrorNotOpen];
}
return nil;
}
メソッドの基になるPOSIXエラーバージョンを使用する例を次に示します。
filefp = fopen([filename UTF8String], "rb");
if (filefp == NULL)
{
if (error != NULL)
{
*error = [self error:@"Failed to open file"
code:ErrorOpenFileFailed
posixError:errno];
}
return NO;
}