source

아이폰 앱에서 NSError를 사용하려면 어떻게 해야 하나요?

lovecheck 2023. 4. 12. 22:29
반응형

아이폰 앱에서 NSError를 사용하려면 어떻게 해야 하나요?

에서 오류를 잡는 방법을 .NSError사용방법과 기입방법이 조금 헷갈립니다.

제가 기입하면 좋을지 감사하겠습니다.NSError

보통 이 발생할 수 를 ,, 제, 제, 제, 제, 제, well, well, well, well, well, well을 참조하는 입니다.NSError, 는 그 방법을 사용할 수 .NSError오류 데이터가 포함된 참조를 수행하고 메서드에서 0을 반환합니다.

예:

- (id) endWorldHunger:(id)largeAmountsOfMonies error:(NSError**)error {
    // begin feeding the world's children...
    // it's all going well until....
    if (ohNoImOutOfMonies) {
        // sad, we can't solve world hunger, but we can let people know what went wrong!
        // init dictionary to be used to populate error object
        NSMutableDictionary* details = [NSMutableDictionary dictionary];
        [details setValue:@"ran out of money" forKey:NSLocalizedDescriptionKey];
        // populate the error object with the details
        *error = [NSError errorWithDomain:@"world" code:200 userInfo:details];
        // we couldn't feed the world's children...return nil..sniffle...sniffle
        return nil;
    }
    // wohoo! We fed the world's children. The world is now in lots of debt. But who cares? 
    return YES;
}

이렇게 하면 됩니다.메서드가 0을 반환하지 않는 한 오류 개체를 검사할 필요도 없습니다.

// initialize NSError object
NSError* error = nil;
// try to feed the world
id yayOrNay = [self endWorldHunger:smallAmountsOfMonies error:&error];
if (!yayOrNay) {
   // inspect error
   NSLog(@"%@", [error localizedDescription]);
}
// otherwise the world has been fed. Wow, your code must rock.

에러에 할 수 .localizedDescription" "에 값을 에"NSLocalizedDescriptionKey

더 많은 정보를 얻을 수 있는 가장 좋은 장소는 애플의 문서입니다.정말 맛있어요.

코코아는 내 여자친구다에 대한 멋지고 간단한 튜토리얼도 있다.

최근 구현한 내용을 바탕으로 몇 가지 제안을 추가하고자 합니다.Apple의 코드를 봤는데, 제 코드도 거의 같은 방식으로 동작하는 것 같아요.

위의 투고에서는 NSError 오브젝트 작성 및 반환 방법에 대해 설명하고 있기 때문에, 그 부분은 신경 쓰지 않습니다.에러(코드, 메시지)를 앱에 통합하는 좋은 방법을 제안해 보겠습니다.


도메인(앱, 라이브러리 등)의 모든 오류 개요를 나타내는 헤더를 1개 작성할 것을 권장합니다.현재 헤더는 다음과 같습니다.

FSERror.h

FOUNDATION_EXPORT NSString *const FSMyAppErrorDomain;

enum {
    FSUserNotLoggedInError = 1000,
    FSUserLogoutFailedError,
    FSProfileParsingFailedError,
    FSProfileBadLoginError,
    FSFNIDParsingFailedError,
};

FSError.m

#import "FSError.h" 

NSString *const FSMyAppErrorDomain = @"com.felis.myapp";

이제 위의 값을 오류에 사용할 때 Apple은 앱에 대한 몇 가지 기본 표준 오류 메시지를 만듭니다.다음과 같은 오류가 발생할 수 있습니다.

+ (FSProfileInfo *)profileInfoWithData:(NSData *)data error:(NSError **)error
{
    FSProfileInfo *profileInfo = [[FSProfileInfo alloc] init];
    if (profileInfo)
    {
        /* ... lots of parsing code here ... */

        if (profileInfo.username == nil)
        {
            *error = [NSError errorWithDomain:FSMyAppErrorDomain code:FSProfileParsingFailedError userInfo:nil];            
            return nil;
        }
    }
    return profileInfo;
}

생성 메시지Apple)error.localizedDescription위의 코드에 대해서는, 다음과 같이 표시됩니다.

Error Domain=com.felis.myapp Code=1002 "The operation couldn’t be completed. (com.felis.myapp error 1002.)"

이 메시지는 오류가 발생한 도메인과 대응하는 오류 코드를 표시하므로 위의 내용은 이미 개발자에게 매우 유용합니다. 코드인지 알 수.1002단, 각 코드에 대해 몇 가지 좋은 메시지를 구현해야 합니다.

에러 메시지에 대해서는, 현지화를 염두에 둘 필요가 있습니다(즉시 현지화 메시지를 실장하지 않는 경우라도).저는 현재 프로젝트에서 다음과 같은 접근방식을 사용했습니다.


1) 작성strings에러가 격납되어 있는 파일.문자열 파일은 쉽게 현지화할 수 있습니다.파일은 다음과 같습니다.

FSERror.strings

"1000" = "User not logged in.";
"1001" = "Logout failed.";
"1002" = "Parser failed.";
"1003" = "Incorrect username or password.";
"1004" = "Failed to parse FNID."

2) 매크로를 추가하여 정수 코드를 현지화된 오류 메시지로 변환합니다.Constants+Macros.h 파일에서 2개의 매크로를 사용했습니다.이 파일은 항상 프리픽스헤더에 포함합니다(MyApp-Prefix.pch)를 참조해 주세요.

상수+매크로스.h

// error handling ...

#define FS_ERROR_KEY(code)                    [NSString stringWithFormat:@"%d", code]
#define FS_ERROR_LOCALIZED_DESCRIPTION(code)  NSLocalizedStringFromTable(FS_ERROR_KEY(code), @"FSError", nil)

3) 이제 오류 코드를 기반으로 사용자에게 친숙한 오류 메시지를 쉽게 표시할 수 있습니다.예:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
            message:FS_ERROR_LOCALIZED_DESCRIPTION(error.code) 
            delegate:nil 
            cancelButtonTitle:@"OK" 
            otherButtonTitles:nil];
[alert show];

알렉스, 좋은 대답이야잠재적인 문제 중 하나는 NULL 참조 해제입니다.NSError 객체 생성반환에 대한 Apple의 레퍼런스

...
[details setValue:@"ran out of money" forKey:NSLocalizedDescriptionKey];

if (error != NULL) {
    // populate the error object with the details
    *error = [NSError errorWithDomain:@"world" code:200 userInfo:details];
}
// we couldn't feed the world's children...return nil..sniffle...sniffle
return nil;
...

목표-C

NSError *err = [NSError errorWithDomain:@"some_domain"
                                   code:100
                               userInfo:@{
                                           NSLocalizedDescriptionKey:@"Something went wrong"
                               }];

스위프트 3

let error = NSError(domain: "some_domain",
                      code: 100,
                  userInfo: [NSLocalizedDescriptionKey: "Something went wrong"])

다음 튜토리얼을 참조하십시오.

도움이 되길 바라지만 NSError에 대한 문서를 읽어야 합니다.

링크는 최근에 Error Handling을 발견했습니다.

Alex의 훌륭한 답변과 jlmendezbonini의 요점을 요약하여 모든 ARC가 호환되도록 수정해 보겠습니다(ARC는 반환해야 하므로 아직까지는 불평하지 않습니다).id('모든 객체'를 의미하지만)BOOL오브젝트 타입이 아닙니다).

- (BOOL) endWorldHunger:(id)largeAmountsOfMonies error:(NSError**)error {
    // begin feeding the world's children...
    // it's all going well until....
    if (ohNoImOutOfMonies) {
        // sad, we can't solve world hunger, but we can let people know what went wrong!
        // init dictionary to be used to populate error object
        NSMutableDictionary* details = [NSMutableDictionary dictionary];
        [details setValue:@"ran out of money" forKey:NSLocalizedDescriptionKey];
        // populate the error object with the details
        if (error != NULL) {
             // populate the error object with the details
             *error = [NSError errorWithDomain:@"world" code:200 userInfo:details];
        }
        // we couldn't feed the world's children...return nil..sniffle...sniffle
        return NO;
    }
    // wohoo! We fed the world's children. The world is now in lots of debt. But who cares? 
    return YES;
}

이제 메서드 호출의 반환값을 확인하는 대신error정지해 있다nil그렇지 않으면 문제가 있습니다.

// initialize NSError object
NSError* error = nil;
// try to feed the world
BOOL success = [self endWorldHunger:smallAmountsOfMonies error:&error];
if (!success) {
   // inspect error
   NSLog(@"%@", [error localizedDescription]);
}
// otherwise the world has been fed. Wow, your code must rock.

제가 본 또 다른 설계 패턴에는 블록을 사용하는 방법이 있는데, 이것은 특히 메서드가 비동기적으로 실행될 때 유용합니다.

다음과 같은 에러 코드가 정의되어 있다고 합니다.

typedef NS_ENUM(NSInteger, MyErrorCodes) {
    MyErrorCodesEmptyString = 500,
    MyErrorCodesInvalidURL,
    MyErrorCodesUnableToReachHost,
};

다음과 같이 오류를 일으킬 수 있는 방법을 정의합니다.

- (void)getContentsOfURL:(NSString *)path success:(void(^)(NSString *html))success failure:(void(^)(NSError *error))failure {
    if (path.length == 0) {
        if (failure) {
            failure([NSError errorWithDomain:@"com.example" code:MyErrorCodesEmptyString userInfo:nil]);
        }
        return;
    }

    NSString *htmlContents = @"";

    // Exercise for the reader: get the contents at that URL or raise another error.

    if (success) {
        success(htmlContents);
    }
}

그런 다음 호출할 때 NSError 개체를 선언하거나(코드 완료를 통해 확인할 수 있음), 반환 값을 확인할 필요가 없습니다.2개의 블록만 지정할 수 있습니다.하나는 예외가 발생했을 때 호출되고 다른 하나는 성공했을 때 호출됩니다.

[self getContentsOfURL:@"http://google.com" success:^(NSString *html) {
    NSLog(@"Contents: %@", html);
} failure:^(NSError *error) {
    NSLog(@"Failed to get contents: %@", error);
    if (error.code == MyErrorCodesEmptyString) { // make sure to check the domain too
        NSLog(@"You must provide a non-empty string");
    }
}];
extension NSError {
    static func defaultError() -> NSError {
        return NSError(domain: "com.app.error.domain", code: 0, userInfo: [NSLocalizedDescriptionKey: "Something went wrong."])
    }
}

내가 사용할 수 있는 것은NSError.defaultError()유효한 에러 오브젝트가 없는 경우는, 항상 유효하게 됩니다.

let error = NSError.defaultError()
print(error.localizedDescription) //Something went wrong.

조금 문제 범위를 벗어났지만 NSError 옵션이 없는 경우 항상 Low Level 오류를 표시할 수 있습니다.

 NSLog(@"Error = %@ ",[NSString stringWithUTF8String:strerror(errno)]);

언급URL : https://stackoverflow.com/questions/4654653/how-can-i-use-nserror-in-my-iphone-app

반응형