什么是在目标c中抛出异常的替代方法

mal*_*lik 2 objective-c

目标C的Google编码标准说我们不应该抛出异常,那么有什么替代方案@throw呢?

Dir*_*irk 6

一种可能性是通过提供扩展的异常信息NSError:

- (BOOL) doSomethingWhichCanFailWithError: (NSError**)aLocation {
    ...
    if( didFail ) {

        if( aLocation ) {

            *aLocation = [NSError errorWithDomain: kMyErrorDomain code: myErrorCode userInfo: nil];
        }
    }

    return !didFail;
}
Run Code Online (Sandbox Code Playgroud)

调用者可以通过检查结果值来测试调用是否成功.如果在出现错误时需要更多信息,则可以提供位置,该方法可以将其他信息存储到:

NSError* error = nil;

if( ![instance doSomethingWhichCanFailWithError: &error] ) {

    NSString* domain = [error domain];

    if( [kMyErrorDomain isEqual: domain] ) {

         switch( [error code] ) {
         case ...: ...
         default: ...
         }
    }
}
Run Code Online (Sandbox Code Playgroud)