2

10.6以降のCocoaアプリケーションで使用するためのフレームワークを作成しています。

フレームワークの目的は、テキストファイルを解析することです。

明らかに、ファイルが見つからない、権限の問題など、発生する可能性のあるエラーがあります。

フレームワーク内のエラーを処理し、ホストアプリケーションに通知する正しい方法は何ですか?

私の考えは:

  1. 何もせず、ホストアプリケーションに例外をキャッチさせます。

  2. ホストアプリケーションに最初のレスポンダーをフレームワークに登録させ、例外をキャッチしてNSErrorに変換し、ホストアプリのレスポンダーチェーンに渡します。

これらのオプションのいずれかは意味がありますか?他に選択肢はありますか?これを処理する正しい方法は何ですか?

エラーおよび例外処理ガイドを読みましたが、この状況については説明しておらず、アプリケーション自体のエラー処理についてのみ説明しています。

4

2 に答える 2

2

正しい方法は、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;
}
于 2012-05-20T05:30:22.050 に答える
1

例外は、Objective-Cの端末エラーにのみ使用する必要があります。具体的には、CocoaとCocoa Touchは、境界を越えてスローされた例外が反対側に発生することを保証しないため、エラー処理に例外を使用しないでください。

呼び出し元にエラーを報告する正しい方法は、NSErrorオブジェクトを使用することです。多くのCocoaおよびCocoaTouchメソッドには、まさにその目的のためにNSError*パラメーターが含まれていることに気付くでしょう。

于 2012-05-20T05:29:36.290 に答える