6

私はObjectivecでこのようなことを達成しようとしています。

@try{
//some code that will raise exception
}
@catch(CustomException e){//How to create this
//catching mechanism
}
@catch(NSException e){
//Generic catch
}

CustomExceptionクラスを作成して使用する必要があります。このCustomExceptionの作成を手伝って、これを使用する方法を教えてください。

前もって感謝します。

4

2 に答える 2

27

Objective-Cのこのような制御フローで例外が使用されることはめったにありません。あなたはJava(または同様の)バックグラウンドを持っていると思います。

私はあなたがこのようなコードを書くことができないと言っているわけではありませんが、あなたのコードを見ている他の人にとっては非常に奇妙に感じ、例外を完全に分離しないと他の人のコードによって使用されるとうまくいかない可能性があります彼らのコードに到達することはありません。

Objective-Cで一般的に行われている方法

例外は重大なエラーに使用されます。エラーが予想される場合(必要なためと思われる@try場合)、代わりにを試して返す必要がありNSErrorます。これは、FoundationフレームワークとCocoaフレームワーク、およびサードパーティのフレームワーク全体で使用されているデザインパターンです。たとえば、ネットワーキング、ファイルの読み取り/書き込み、またはJSONコードを見てください(JSONObjectWithData:options:error:

あなたがすること

メソッドの最後に、次のように失敗する可能性のあるエラーパラメータ(ダブルポインタ)を追加します。

- (MyResultObject *)myMethodThatCouldFailWith:(MyObject *)myObject
                                        error:(NSError **)error;

誰か(あなたまたは他の誰か)がこのメソッドを使用する場合、次のように、エラーが発生した場合に設定されるNSErrorポインターを渡したい場合に使用できます。

NSError *error = nil; // Assume no error
MyResultObject *result = [self myMethodThatCouldFailWith:myObject
                                                   error:&error];
if (!result) {
    // An error occurred, you can check the error object for more information.
}

&エラーパラメータの前のアンパサンド()に注意してください。NSErrorこれは、エラーポイントを引数として送信しているため、危険なメソッド内で、メソッドが戻った後に読み取ることができる新しいオブジェクトを指すようにポインタを変更できることを意味します。

これで、失敗する可能性のあるメソッド内で、NSError(例外を発生させる代わりに)何か問題が発生した場合にエラーを新しいオブジェクトに設定します。また、エラーが発生したときに戻ることもよくあります。これはnil、計算が完了できないか、データの信頼性が低いか、関連性がないことを意味している可能性があります。

- (MyResultObject *)myMethodThatCouldFailWith:(MyObject *)myObject
                                        error:(NSError **)error {
    // Do something "risky" ...
    MyResultObject *result = [MyResultObject somethingRiskyWith:myObject];
    
    // Determine if things went wrong
    if (!result) {
        // Set error if a pointer for the error was given 
        if (error != NULL) {
            *error = [NSError errorWithDomain:yourErrorDomain
                                         code:yourErrorCode
                                     userInfo:optionalDictionaryOfExtraInfo];
        }
        return nil;
    }
    
    // Everything went fine.
    return result;
}

これで、エラーが返された場合、指定したエラーコードからエラーの種類を識別でき、ユーザー情報ディクショナリ(多くの情報を追加できます)でより詳細な情報を読み取ることができます。

于 2012-07-15T15:51:57.983 に答える
13

最も単純なケースでは、...を使用してクラスを宣言できます。

@interface CustomException : NSException
@end
@implementation CustomException
@end

...そしてコードはあなたが投稿したものと非常によく似ています:

   @try{
        @throw [[CustomException alloc] initWithName:@"Custom" reason:@"Testing" userInfo:nil];
    }
    @catch(CustomException *ce){
        NSLog(@"Caught custom exception");
    }
    @catch(NSException *e){
        NSLog(@"Caught generic exception");
    }
于 2012-07-15T15:51:46.343 に答える