아이폰 앱에서 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
'source' 카테고리의 다른 글
특정 커밋에 대한 리모트 리셋 (0) | 2023.04.12 |
---|---|
Java에서 Excel 파일 생성 (0) | 2023.04.12 |
컴파일 경고: 아키텍처 i386의 파일을 처리하는 규칙이 없습니다. (0) | 2023.04.12 |
2차원 어레이를 기반으로 WPF 그리드를 채우는 방법 (0) | 2023.04.12 |
iOS UIView 컨트롤러의 라이프 사이클을 이해하려고 합니다. (0) | 2023.04.12 |