1

미리 iPhone/Objective-C 모범 사례에 대한 저의 이해가 부족합니다. .NET/C# 배경에서 왔습니다.iPhone 제작/출시 예외 처리

iPhone 용 예외 처리와 관련하여 많은 게시물을 읽었지 만 대부분의 사람들이 프로덕션 코드를 수행하는 것에 대해서는 아직 명확하지 않습니다. 또한, 나는 일반적으로 기대하는 에러 처리 기능을 가진 오픈 소스 앱을 찾을 수 없었다. 내 질문은 다음과 같습니다.

1) 예기치 않은 결과가 발생하여 결국 응용 프로그램이 실패하는 경우 예외가 발생하거나 나중에 실패 할 때까지 기다리시겠습니까? 예 :

if (![fileManager createDirectoryAtPath: myNewDir 
    withIntermediateDirectories: YES 
    attributes: nil 
    error: &myError]) { 

    // My app shouldn't continue. Should I raise an exception? 
    // Or should I just log it and then wait for it to crash later? 
} 

2) 매개 변수의 유효성을 검사합니까? 예를 들어 C#에서는 보통 null을 확인하고 필요한 경우 ArgumentNullException을 throw합니다.

3) 응용 프로그램이 충돌하면 충돌 정보가 자동으로 기록 되나요? 아니면 처리되지 않은 예외 처리기를 설정해야합니까? 이 메서드 내에서 UIAlertView를 표시하여 앱을 그냥 사라지게하는 대신 사용자에게 나쁜 일이 발생했음을 알릴 수 있습니까? (그렇다면 제대로 작동하지 않을 수 있습니다.)

4) 마지막으로 @ try/@ catch/@를 사용하는 사람이 있습니까? C#에서 광범위하게 사용되었지만이를 사용하는 오픈 소스 앱을 찾지 못했습니다. (어쩌면 나는 틀린 애플 리케이션을보고있을 뿐이다.)

답변

2

광고 1. 당신이주는 예제는 자바에서 "checked exception"을 사용해야하는 다소 고전적인 예이다. 메서드의 호출자는 제어 할 수있는 외부의 이유로 호출이 실패 할 수 있도록 준비되어야합니다. 당신이 실제로 예외를 제기 할 수 있지만, 또한 환불되지 않습니다, 오류가 정말 복구 할 수없는 경우

- (BOOL) prepareDirectories: (NSString*) path error: (NSError**) location { 

    if(![fileManager createDirectoryAtPath: path 
         withIntermediateDirectories: YES 
         attributes: nil 
         error: location]) { 

     return NO; 
    } 

    // ... additional set-up here 
    return YES; 
} 

: 특히, 주어진 예제에서는 오류 설명 개체가 호출자에게 다시 전파 할 수 있도록 것입니다 응용 프로그램 사용자에게 적절한 오류 메시지를 표시 할 수있는 기회.

광고 2. 예, 매개 변수 유효성 검사는 반드시해야 할 일입니다. 예기치 않은 예외 (예 : nil)를 제기하는 것이 전적으로 적합합니다. 나쁜 매개 변수는 "프로그래머의 오류"이며 프로그램이 여전히 일관된 상태에 있음을 보장 할 수 없습니다. 예를 들어, 존재하지 않는 색인을 사용하여 요소를 가져 오려고하면 NSArray이 예외를 발생시킵니다.

광고 3. 캐치되지 않은 예외로 인해 응용 프로그램이 중단되면 사실이 자동으로 기록됩니다. 정말로 오류 메시지를 표시하려면 예외를 잡을 수 있습니다. 그러나 앱이 일관성이없는 상태 일 가능성이 높으며 계속해서는 안되기 때문에 단순히 앱이 다운되는 것을 허용하는 것이 가장 좋은 방법입니다.

광고 4. 잘 모르겠습니다.

1
  1. 특정 경우에 사용자는 상황을 해결하는 방법에 대한 지침이 방금 발생한 것을 사용자에게 알려야합니다. 극단적 인 상황을 제외하고 앱을 종료해서는 안됩니다. 사용자가 잘못한 부분을 수정하도록 한 다음 다시 시도하십시오.
  2. 매개 변수 유효성 검사는 많은 요인에 따라 달라집니다. 한 가지 명심해야 할 것은 Obj-C에서 메시지를 nil으로 보내는 것이 완벽하게 유효하다는 것입니다 (그렇게하면 아무 일도 일어나지 않습니다). 그래서 많은 경우에 nil을 검사 할 필요가 없습니다. 모델 클래스에 있으면 항상 메소드의 매개 변수를 확인합니다. 내가 거의 아무것도 검증하지 않는다면 유형 검사만으로 충분합니다.
  3. 일부 정보는 기록되어야하지만 상황에 따라 더 구체적인 정보를 기록하는 것이 좋습니다. 이상적으로는 처리되지 않은 예외 상태에 도달하지 않아야합니다.
  4. 코코아 클래스는 거의 환경상의 이유로 예외를 throw하지 않으며, 당신이 뭔가 잘못했기 때문에 거의 항상 발생합니다. 예를 들어, 보통 @ try/@ catch 블록을 [NSString stringWithString:]에 두지는 않을 것입니다. 예외를 던질 수있는 유일한 방법은 시도 할 때 nil을 전달하는 것입니다. nil을 전달하지 않았는지 확인하고 예외를 잡는 것에 대해 걱정할 필요가 없습니다. 메서드가 컨트롤 외부의 이유로 인해 실패 할 수있는 경우 대개 NSError를 통해 통신합니다. 예를 들어 메서드가 NSManagedObjectContext 인 것을보십시오.