macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSExceptionクラス

INDEX>Foundation>NSException

apple(mac)
apple(iOS)

解説

例外処理に関するクラスです。

継承 NSObject
準拠 NSCoding
NSCopying
NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 Mac OS X v10.0以降
iOS 2.0以降
定義 NSException.h

概要

例外を表すクラスです。Cbjective-Cでは積極的に例外を使用することはありません。基本的に例外が出ないようにプログラムを組むことになります。

例外オブジェクトの作成と発生

例外オブジェクトを作成するには(+ exceptionWithName:reason:userInfo)メソッドを使用します。

#pragma mark
- (IBAction)button001:(id)sender {

    NSException *exception = [NSException exceptionWithName:@"An Exception"
                                                     reason:@"reason"
                                                   userInfo:nil];
     
    [exception raise];
}


作成した例外オブジェクトの例外を発生させるには(– raise)メソッドを使用します。指定した名前とフォーマット文字列からなるメッセージで例外を発生させるには(+ raise:format)メソッドを使用します。allocで作成した例外オブジェクトを初期化するには(– initWithName:reason:userInfo)メソッドを使用します。

例外を発生させる

#pragma mark
- (IBAction)button002:(id)sender {
    [NSException raise:@"exception name" format:@"format %@",@"aaa", nil];
}

名前と、va_listで引数を渡したフォーマット文字列からなるメッセージで例外を発生させるには(+ raise:format:arguments)メソッドを使用します。

va_listで引数を渡す。

#pragma mark

va_list dynamicArgument(int arg_num , ...) {
	va_list args;
	int p , count;
	if (arg_num < 1) return nil;
	va_start(args , arg_num);
    
    printf("項目数 = %d\n" , arg_num);
	for (count = 0 ; count < arg_num ; count++) {
		p = (int)va_arg(args , int *);
		printf("第%d引数 = %d\n" , count + 2 , p);
        
	}
    
	va_end(args);
	return args;
}
- (IBAction)button003:(id)sender {
    va_list vList;
    vList = dynamicArgument(5 , 10 , 20 , 30 , 40,100);
    [NSException raise:@"errName" format:@"%d,%d,%d,%d,%d" arguments:vList];
}

例外オブジェクトの情報

例外オブジェクトが含む、名前を取得するには(– name)メソッドを使用します。
例外オブジェクトが含む、例外の理由を取得するには(– reason)メソッドを使用します。例外オブジェクトが含む追加情報を取得するには(– userInfo)メソッドを使用します。

スタックフレームの例外の取得

例外オブジェクトが含む関数呼び出しのスタックの配列を取得するには(– callStackReturnAddresses)メソッドを使います。シンボルも付加して取得するには(– callStackSymbols)メソッドを使用します。

callStackSymbolsで取得したシンボルを表示させた例

0   CoreFoundation                      0x014b403e __exceptionPreprocess + 206
	1   libobjc.A.dylib                     0x00eb4cd6 objc_exception_throw + 44
	2   CoreFoundation                      0x0145ca48 +[NSException raise:format:arguments:] + 136
	3   NSException                         0x000034bf -[OOOViewController button003:] + 207
	4   CoreFoundation                      0x014b5e99 -[NSObject performSelector:withObject:withObject:] + 73
	5   UIKit                               0x0001a14e -[UIApplication sendAction:to:from:forEvent:] + 96
	6   UIKit                               0x0001a0e6 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
	7   UIKit                               0x000c0ade -[UIControl sendAction:to:forEvent:] + 66
	8   UIKit                               0x000c0fa7 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 503
	9   UIKit                               0x000c0266 -[UIControl touchesEnded:withEvent:] + 549
	10  UIKit                               0x0003f3c0 -[UIWindow _sendTouchesForEvent:] + 513
	11  UIKit                               0x0003f5e6 -[UIWindow sendEvent:] + 273
	12  UIKit                               0x00025dc4 -[UIApplication sendEvent:] + 464
	13  UIKit                               0x00019634 _UIApplicationHandleEvent + 8196
	14  GraphicsServices                    0x0139eef5 PurpleEventCallback + 1274
	15  CoreFoundation                      0x01488195 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
	16  CoreFoundation                      0x013ecff2 __CFRunLoopDoSource1 + 146
	17  CoreFoundation                      0x013eb8da __CFRunLoopRun + 2218
	18  CoreFoundation                      0x013ead84 CFRunLoopRunSpecific + 212
	19  CoreFoundation                      0x013eac9b CFRunLoopRunInMode + 123
	20  GraphicsServices                    0x0139d7d8 GSEventRunModal + 190
	21  GraphicsServices                    0x0139d88a GSEventRun + 103
	22  UIKit                               0x00017626 UIApplicationMain + 1163
	23  NSException                         0x00002791 main + 161
	24  NSException                         0x000026e5 start + 53

適合するプロトコル

メソッド

NSExceptionオブジェクトの内容

– name
– reason
– userInfo

例外スタックフレームを得る

– callStackReturnAddresses
例外オブジェクトにこのメソッドを送信することで、スタック上のすべての関数の戻りアドレスをさすNSNumberの配列(NSArray)が得られる。

– callStackSymbols
例外が作成されたときのスタック上のすべての関数、メソッド名が得られる。

サブクラス化の注意