55033


iOSプログラミングではエラーコードを
[`OSStatus`型](https://developer.apple.com/documentation/kernel/osstatus?language=objc)
で表現しますが、アプリケーション独自のエラーコード定義に使ってよい値の範囲は公式に存在するのでしょうか？コールバック関数からの戻り値などで、システム／フレームワーク定義値と重複しえないエラーコードを定義したいためです。

Web上で検索すると「1000 ～ 9999
がそのような用途に予約済み」という主張も見かけはするのですが、できればApple公式リファレンスなどがあると助かります。

* * *

追記：本質問の意図は「新規設計する自前ソースコード部で `OSStatus`
型を利用したい」わけではなく、「コールバック関数と組み合わせて用いるレガシーAPIにおいて、コールバック関数が返す `OSStatus`型
の独自エラーコードと、同レガシーAPIが返すエラーコードの衝突が起きない保証を得たい」です。

具体的には
[`AudioConverterFillComplexBuffer`](https://developer.apple.com/documentation/audiotoolbox/1503098-audioconverterfillcomplexbuffer?language=objc)
関数と、コールバック
[`AudioConverterComplexInputDataProc`](https://developer.apple.com/documentation/audiotoolbox/audioconvertercomplexinputdataproc?language=objc)
において、後者コールバック関数から「アプリケーション独自のエラーコード値」を返して`AudioConverterFillComplexBuffer`呼び出し元に伝搬したいが、フレームワークが定義するエラーコード値との衝突は避けたいです。


CC BY-SA 4.0
2019-05-17T04:21:40.933
55032
2019-05-17T09:46:47.187
2019-05-17T09:46:47.187
49
49
question
ios objective-c
iOSアプリケーション独自で利用可能なOSStatus値域


Apple社による古い（2003年頃？）リファレンス "Error Handler Reference"
には、下記の記載があったようです（強調部は引用者による）。

> `OSStatus`
>
> A numeric code used in Carbon to indicate the return status of a function.
[code]

>     typedef SInt32 OSStatus;
>  
[/code]

>
> Discussion
>
> The system software sometimes uses error codes to inform an application that
> a requested service is not possible. Many functions return a result code of
> type `OSStatus` that indicates whether the function completed successfully,
> and if not, what the reason for failure was.
>
> If you want to use `OSStatus` to define error codes for your application,
> **Apple recommends that you use values in the range 1000 through 9999
> inclusive.** Values outside of this range are reserved by Apple for internal
> use.


CC BY-SA 4.0
2019-05-17T04:49:20.010
55033
2019-05-17T04:49:20.010
49
55032
answer


`NSException`を使うのはいかがでしょうか？

`MYException.h`

[code]

    extern NSString * _Nonnull const Name1;
    extern NSString * _Nonnull const Reason1;
    extern NSString * _Nonnull const Name2
    extern NSString * _Nonnull const Reason2;
    
    @interface MYException: : NSException
    @end
    
[/code]

`MYException.m`

[code]

    NSString * _Nonnull const Name1 = @"エラーの名前1";
    NSString * _Nonnull const Reason1 = @"エラーの具体的な内容1";
    NSString * _Nonnull const Name2 = @"エラー名前2";
    NSString * _Nonnull const Reason2 = @"エラーの具体的な内容2";
    
    @implement MYException
    @end
    
[/code]

コールバック先でエラーが発生した場合、そのエラーがわかった所で

[code]

    @throw [MYExceptioon exceptionWithName:Name1 reason:Reason1 userInfo:nil];
    
[/code]

の様な感じで例外を`throw`します。  
`userInfo`はこの例では`nil`にしてなにも渡していませんが、`NSDictionary`オブジェクトを受け渡しする事でエラーコードや、エラーが起きたオブジェクトなど、より詳細な情報を受け渡す事ができます。

コールバック元は、例外を受け取れるように

[code]

    @try {
        // この中でコールバック先を呼ぶ
        // （本来のエラーが起きなかったときのアルゴリズム）
    }
    @catch (MYException *exception) {
        // @throwされると、同じ型の処理を宣言したcatchに落ちてくる。
        // *exceptionを用いて例外処理
    }
    @catch (NSException *exception {
        // 型が違う例外もこの様にしてcatch出来る
        // @catch (型 *変数名) の型はNSExceptionを継承している必要はない
    }
    @finally {
        // 例外が起きても起きなくても例外発生後に行いたい処理
    }
    
[/code]

という記述をする必要がありますが、エラーがなければ`@try`の中を順次処理していき、あれば`@finally`の中が、そしてブロックの外に続いて処理が行われるので、本来のアルゴリズムとエラー処理を分離して書けるというメリットがあります。


CC BY-SA 4.0
2019-05-17T09:33:23.597
55055
2019-05-17T09:33:23.597
14745
55032
answer


> iOSプログラミングではエラーコードを OSStatus型 で表現しますが、

ということはなく、正確には標準フレームワークによって提供されている一部の（主に古い）APIで使われている、というのが一般的な理解です。

かつ、 `OSStatus`は単なる数値なので最近のモダンなプログラミングではエラーを返す型としては不十分と一般的に考えられます。

Swiftであるなら、ErrorタイプやSwift
5から入ったResult、Cocoaの文脈ならNSError、や戻り値にエラーを示す専用のデータ構造を作る、など、よりエラーの情報を豊富に返せる方法を選択する方が良いです。

既存のものがそうなっていてそれの改修なら仕方ないですが、通常これから新しく書くiOSプログラミングでOSStatusをエラーとして採用することは合理的ではありません。


CC BY-SA 4.0
2019-05-17T09:40:30.980
55056
2019-05-17T09:40:30.980
5519
55032
answer