예외처리

Download Report

Transcript 예외처리

예외처리
 NSException 클래스가 처리
 NSException의 멤버
name
reason
callStackReturnAddresses
 자주 보이는 NSException의 하위 클래스
NSRangeException
NSInvalidArgumentException
NSInternalInconsistencyException
 Objective-C의 예외처리를 위한 예약어
@try: Exception이 던져질 수 있는 block을 정의합니다.
@throw: Exception object를 던집니다.
@catch(): @try block안에서 던져진 exception을 catch합니다.
@finally: @try block에서 Exception이 던져지던 아니던 수행되어질
block code를 정의합니다.
예외처리 예제(Command Line)
#import <Foundation/Foundation.h>
@interface Test : NSObject
@end
@implementation Test
@end
int main (int argc, char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Test *Obj = [[Test alloc] init];
@try
{
//이런 메서드가 없음
//예외가 발생되고 처리를 catch에 넘김
[Obj Test];
}
}
@catch (NSException *exception)
{
NSLog (@"예외처리 구문 수행");
NSLog (@"예외 이름: %@",exception.name);
NSLog (@"예외 이유: %@",exception.reason);
}
@finally
{
NSLog (@"무조건 수행하는 구문");
[Obj release];
[pool drain];
}
return 0;
NSAssert
특정 조건을 만족하지 않는 경우 NSInternalInconsistencyException예외를 발생
시켜 프로그램을 강제로 중단시키는 매크로함수
사용방법
NSAssert(만족해야 하는 조건, 출력할 문장);
예제
#import <Foundation/Foundation.h>
@interface Test : NSObject
-(void)disp;
@end
@implementation Test
-(void)disp
{
int n = 15;
NSAssert(((n < 10) && (n >= 0)), @"프로그램 중단");
NSLog(@"정상 수행");
}
@end
int main ()
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Test *Obj = [[Test alloc]init];
@try
{
[Obj disp];
}
@catch (NSException *exception)
{
NSLog (@"예외처리 구문 수행");
NSLog (@"예외 이름: %@",exception.name);
NSLog (@"예외 이유: %@",exception.reason);
}
[pool drain];
return 0;
}
에러 처리
1. 에러 처리
에러가 발생하면 메서드나 함수의 리턴 값 형태로 에러의 발생을 리턴합니다.
파일 처리에는 이러한 에러 처리를 위한 객체를 대입하도록 되어 있습니다.
이 경우 에러 처리에 관련된 오브젝트를 대입하면 에러가 발생해도 프로그램이
중단되지 않고 적절한 메시지를 출력하도록 프로그램을 만들 수 있습니다.
2. NSError
에러에 대한 정보를 저장할 수 있는 클래스
생성자
+(id)errorWithDomain:(NSString *)domain code:(NSInteger)code
userInfo:(NSDictionary *)dic
멤버 프로퍼티
(NSString *)domain: 에러와 관련된 기술 요소 (Cocoa, Unix…)
(NSInteger)code: 에러에 관련된 정수 값
(NSDictionary *)userInfo: 에러에 관련된 정보를 저장할 사전
멤버 메서드
(NSString *)localizedDescription: 에러를 설명하는 문자열로 domain과 code 출력
(NSString *)localizedFailureReason: 에러의 발생 원인
(NSString *)localizedRecoverySuggestion: 에러의 대처 방법
예제
#import <Foundation/Foundation.h>
int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
NSError *error = nil;
NSStringEncoding enc = NSASCIIStringEncoding ;
NSString *contents;
contents = [NSString stringWithContentsOfFile:@"hello.txt" usedEncoding:&enc error: &error];
if(error != nil)
{
NSLog(@"%i", [error code]);
NSLog(@"%@", [error domain]);
NSLog(@"%@", [error localizedDescription]);
}
else
NSLog(@"파일 내용: %@", contents);
[pool drain];
return 0;
}
X-Code 화면 설정
[X-Code] – [Preference] 메뉴를 이용합니다.
[All – In – One]: 빌드, 디버깅, 검색 등이 모두 하나의 창에서 실행
[Condensed]: 파일 창, 편집 창, 디버깅 창 등이 모두 분리되어서 실행
[Default]: 그룹 및 파일 창, 편집 창 등은 통합되어 있고 디버깅 창, GDB 콘솔 등
의 일부 창은 분리된 상태에서 실행
Break Point
 Break Point 설정
원하는 지점을 선택하고 마우스 오른쪽을 클릭해서 Add BreakPoint
 Break Point 삭제
Break Point를 선택하고 마우스 오른쪽을 클릭해서 remove BreakPoint
 Break Point 까지 실행 후 옵션
Continue: 코드를 계속 실행
Step Over: 코드 다음 행으로 이동
Step Into - 코드가 다른 메서드를 호출하는 경우 메서드 안으로 진입
Step Out - 현재 메서드를 빠져 나가서 호출하는 메서드로 이동
 Break Point에 동작 지정하기
Break Point에서 오른쪽의 + 버튼을 눌러서 동작 지정 가능
[Log]: 콘솔에 로그를 남기기
[Sound]: 시스템에 내장된 소리를 재생
[Shell Command]: 셀 명령 실행
[Debugger Command]: GDB 명령을 남김
Debugger
메뉴의 Run – Debugger 나 단축키 Shift + Command + y를 이용해서 화면에
출력할 수 있습니다.
화면 구성은 3개 영역으로 만들어져 있습니다.
Stack Trace, Variable List, Debugger Editing
메뉴
> Build and Debug:빌드를 하고 성공하면 디버그를 실행합니다.
> Terminate
디버깅시 나타나며 클릭하면 실행과 디버깅을 종료합니다.
> Fix
디버깅 실행 중에 소스 수정이 필요할 경우에는 소스를 수정하고 Fix를 실행하면, 종료/재시작 없이
계속 디버깅을 진행할 수 있습니다.
> Restart
Terminate와 Debug 명령을 동시에 실행하여, 종료 후 바로 디버깅을 재시작합니다.
> Pause:실행을 잠시 멈춥니다.
> Continue:실행이 중지되어 있을 때, 다음 브레이크포인트를 만나기 전이나 오류발생, 종료 전까지
계속 실행합니다.
> Step Over:함수를 만나도 함수 내부로 이동해서 디버깅을 하지 않고, 다음 라인을 실행합니다.
> Step Into:함수를 만날 경우 함수내부로 진입하여 디버깅을 진행합니다.
> Step Out:현재 함수의 수행을 완료하고 호출된 지점으로 돌아 갑니다.
> Breakpoints:
현재 라인에 브레이크포인트를 추가 또는 제거 합니다.
브레이크포인트는 디버깅 진행시 사용자가 확인을 위하여 어플리케이션 실행이 잠시 중지되는 위치
입니다.
> Console:gdb를 직접 사용할 수 있게 해줍니다.
예제
1. 소스 파일에 임의의 Break Point설정
2. Break Point에 아래처럼 설정
[Log]: 브레이크 포인트
[Sound]: Basso
[Shell Command]: ls -al
[Debugger Command]: print (const char *)args[0]
[Apple script]: display dialog "Welcome to AppleScript."
Watch Point
변수의 값이 변경되는 경우를 감시하고자 하는 경우에 사용하는 기능
이 포인트를 설정해두면 변수의 값이 변경되면 실행이 자동적으로 멈추게 됩니
다.
디버거 창의 Variable 항목에서 선택할 수 있으며 변수를 선택하고 마우스 오른쪽
메뉴를 눌러서 Watch Variable를 선택해서 선택하면 됩니다.
예제
1. View Based Application 프로젝트 생성(DebugTest)
2. DebugTestViewController.m 파일에 viewDidLoad 메서드 재정의
- (void)viewDidLoad
{
[super viewDidLoad];
[self method1];
[self method2];
}
3. DebugTestViewController.m 파일에 2개의 메서드 구현
-(void)method1
{
NSLog(@"첫번째 메서드");
}
-(void)method2
{
NSLog(@"두번째 메서드");
}
4. DebugTestViewController.m 파일의 int j 부분에 break Point를 설정한 디버거에서 실행해서 step
Over와 Step Into를 비교
Symbolic Break Point
Symbolic Break Point: [Run] – [Show] – [Break Point]에서 직접 메서드의 이름
을 지정하는 것이 가능합니다.
Break Point에 condition을 설정해서 특정 조건을 만나면 수행을 종료하는 것도
가능합니다.
정적 분석
 Build 메뉴의 Build and Analyze를 이용하면 정적 분석을 할 수 있습니다.
 정적 분석이란 논리적인 오류도 일정 부분 검색을 할 수 있습니다.
 변수를 생성하고 사용하지 않는다던지 메모리 할당을 하고 해제를 하지 않은
경우 들을 찾아 낼 수 있습니다.
Instruments
실행 중인 프로그램의 동작 상태를 감시하고 분석하는 데 사용되는 프로그램
작업의 종류(시뮬레이터에서 가능 - 나머지는 디바이스에서만 가능)
1. Leaks: 메모리 누수 감지
2. Object Allocations - 객체의 생성과 해제를 감시
3. CPU Sampler – CPU 사용량 확인
4. Activity Monitor: 시스템 자원을 사용하는 상황을 감시 - 모든 프로그램 검사
실습(Leaks)
1. View Based Application 생성(Leaks)
2. LeaksViewController.h 파일에 변수 및 IBAction 메서드 선언
#import <UIKit/UIKit.h>
@interface LeaksViewController : UIViewController {
NSArray * ar;
}
-(IBAction)click;
@end
3. LeaksViewController.m 파일에 IBAction 메서드 구현
-(IBAction)click
{
ar = [[NSArray alloc] initWithObjects:@"Alloc", nil];
}
4. LeaksViewController.xib 파일의 view에 버튼을 1개 추가하고 IBAction 메서드 연결
5. [Run] – [Start with Performance Tool] – [Leaks]
실행 시킨 후 적색이 나타나면 메모리 leak이 발생한 것이므로 콜 스택을 확인