objective-c / cocoa에서 예외를 발생시키는 가장 좋은 방법은 무엇입니까?
답변
[NSException raise:format:]
다음과 같이 사용 합니다.
[NSException raise:@"Invalid foo value" format:@"foo of %d is invalid", foo];
답변
여기서주의 할 점. Objective-C에서는 많은 다른 언어와 달리 일반적으로 정상적인 작동에서 발생할 수있는 일반적인 오류 상황에 예외를 사용하지 않도록 노력해야합니다.
Obj-C 2.0에 대한 Apple의 설명서 는 다음과 같이 설명합니다. “중요 : Objective-C에서 예외는 리소스를 많이 사용합니다. 일반적인 흐름 제어에 예외를 사용하거나 단순히 오류 (예 : 파일에 액세스 할 수없는 파일)를 나타내서는 안됩니다.”
Apple의 개념적인 예외 처리 문서 는 동일하지만 더 많은 단어로 설명합니다. “중요 : 범위를 벗어난 콜렉션 액세스, 변경 불가능한 오브젝트의 변경, 유효하지 않은 메시지 전송과 같은 예상치 않은 런타임 오류에 대한 예외 사용을 예약해야합니다. 창 서버와의 연결이 끊어짐 일반적으로 런타임이 아닌 응용 프로그램을 만들 때 예외를 제외하고 이러한 종류의 오류를 처리합니다 […..] 예외 대신 오류 개체 (NSError) 및 Cocoa 오류 전달 메커니즘은 Cocoa 응용 프로그램에서 예상되는 오류를 전달하는 데 권장되는 방법입니다. “
이것의 이유는 부분적으로 예외를 던지고 잡는 것이 훨씬 비싸고 Objective-C의 프로그래밍 관용구 (간단한 경우에는 리턴 값을 사용하고 더 복잡한 경우에는 참조 매개 변수 (종종 NSError 클래스)를 사용함)를 고수하기 위해서입니다. 마지막으로 Objective-C 예외는 C의 setjmp () 및 longjmp () 함수 주위의 얇은 래퍼이며 본질적으로 신중한 메모리 처리를 망칠 수 있습니다. 만듭니다. 이 설명을 .
답변
@throw([NSException exceptionWith…])
Xcode는 @throw
명령문과 같은 명령문을 함수 종료점으로 인식 return
합니다. @throw
구문을 사용 하면 잘못된 ” 제어가 무효화 기능 끝에 도달 할 수 있습니다 “경고가 표시 되지 않습니다[NSException raise:…]
.
또한 @throw
NSException 클래스가 아닌 객체를 던지는 데 사용할 수 있습니다.
답변
에 관해서 [NSException raise:format:]
. Java 배경에서 온 사람들에게는 Java가 Exception과 RuntimeException을 구분한다는 것을 기억할 것입니다. 예외는 확인 된 예외이며 RuntimeException은 확인되지 않습니다. 특히, Java는 “정상 오류 조건”에 대해 확인 된 예외를 사용하고 “프로그래머 오류로 인한 런타임 오류”에 대해 확인되지 않은 예외를 사용할 것을 제안합니다. Objective-C 예외는 검사되지 않은 예외를 사용하는 것과 동일한 위치에서 사용해야하며, 검사 된 예외를 사용하는 경우 오류 코드 리턴 값 또는 NSError 값이 선호됩니다.
답변
NSException을 확장하는 자체 클래스와 함께 @throw를 사용하는 것이 더 좋다고 생각합니다. 그런 다음 try catch에 동일한 표기법을 사용하십시오.
@try {
.....
}
@catch{
...
}
@finally{
...
}
Apple은 예외를 처리하고 처리하는 방법을 여기에서 설명합니다.
예외 잡기 예외
던지기
답변
ObjC 2.0부터 Objective-C 예외는 더 이상 C의 setjmp () longjmp ()에 대한 래퍼가 아니며 C ++ 예외와 호환되므로 @try는 “무료”이지만 예외를 던지고 잡는 것이 훨씬 비쌉니다.
어쨌든 (NSAssert 및 NSCAssert 매크로 패밀리를 사용하는) 어설 션은 NSException을 발생시키고 그 상태를 Ries 상태로 사용합니다.
답변
NSError를 사용하여 예외가 아닌 장애를 전달하십시오.
NSError에 대한 빠른 포인트 :
-
NSError를 사용하면 C 스타일 오류 코드 (정수)가 근본 원인을 명확하게 식별하고 오류 처리기가 오류를 극복 할 수 있습니다. NSError 인스턴스에서 SQLite와 같은 C 라이브러리의 오류 코드를 매우 쉽게 래핑 할 수 있습니다.
-
NSError는 또한 객체라는 이점을 가지고 있으며 userInfo 사전 멤버로 오류를보다 자세하게 설명 할 수있는 방법을 제공합니다.
-
그러나 무엇보다도, NSError는 던져 질 수 없으므로 단순히 뜨거운 감자를 더 던지고 콜 스택을 위로 올리는 다른 언어와 달리 오류 처리에 대한 사전 대처 방식을 권장합니다. 의미있는 방식으로 처리되지 않습니다 (OOP의 가장 큰 정보 숨기고 있다고 믿는 경우는 아닙니다).
참조 링크 : 참조