Objective-C。アサーション vs. 例外 vs. エラー
質問
Cocoaでは、いつNSAssert、NSException、NSErrorを使うべきですか?
以下は、私が考えたことです。
NSAssert - プログラマ自身の利益のために使用される任意のクライアントプログラムを作成するときに、ルール、規約、仮定、または事前条件と事後条件をダブルチェックしますか?
NSException - サードパーティライブラリを作成する際、そのライブラリを使用する他のプログラマのために、入力が無効な場合にすぐに分かるようにするため?
NSError - ファイル、データベース、Webサービスなど、外部システムと連携してデータを取得する場合、結果が保証されていないのでは?
どのように解決するのですか?
このような場合 NSAssert は失敗すると例外を投げます。だから NSAssert は、あなたがコードで作った仮定をチェックするための、短くて簡単な方法として存在するのです。例外の代替ではなく、単なる近道だと私は考えています。もしアサーションが失敗したら、あなたのコードの中で何かがひどく間違っていることになり、プログラムを続行してはいけません。
注意すべき点は、NSAssert はリリースビルドではあなたのコードにコンパイルされないので、これは通常、開発中のサニティチェックのために使用されるということです。私は実際には、常にアクティブであるカスタム アサート マクロを使用する傾向があります。
あなたが
@throw
自分の
NSException
は、リリースビルドで絶対に必要な場合、およびパブリックライブラリ/インターフェースのようなもので、いくつかの引数が無効であるか、間違って呼び出された場合に使用されます。標準的な慣習として
@catch
で例外を発生させ、アプリケーションの実行を継続させるというのは、実は標準的なやり方ではないことに注意してください。Appleの標準ライブラリ(例えばCore Data)でこれを試すと、悪いことが起こるかもしれません。アサートと同様に、例外がスローされた場合は、どこかにプログラミング エラーがあることを意味するため、一般にアプリはかなり迅速に終了するはずです。
NSErrors は、プログラミングエラーでない、回復可能なエラーのために、ライブラリ/インターフェースで使用されるべきです。呼び出し側に情報/エラーコードを提供することができ、呼び出し側はエラーをきれいに処理し、必要に応じてユーザーに警告し、実行を継続することができます。これは通常、File-not-found エラーやその他の非致命的なエラーのようなものです。
関連
-
[解決済み】Xcode - 'NSUnknownKeyException', reason: ... this class is not key value coding-compliant for the key X" エラーの修正方法とは?
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] Objective-Cで、オブジェクトの種類をテストするにはどうしたらいいですか?
-
[解決済み] objective-c/cocoaで例外を投げる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] NSAssertって、実は何が言いたいの?
-
[解決済み] 角括弧 < > と引用符 " " を使って #import する。
-
[解決済み] Xcodeはクラッシュの原因となる行を表示しない
-
[解決済み] Objective-Cです。カテゴリ内のプロパティ/インスタンス変数
-
[解決済み] キューに入れられたperformSelector:afterDelayの呼び出しをキャンセルする
-
[解決済み] キーチェーンのアイテムは何がユニークなのか(iOSの場合)?
-
[解決済み] ブロックベースのAPIメソッドでnonnullとnullableのObjective-Cキーワードを使用する方法
-
[解決済み] BOOLプロパティの使用
-
[解決済み] NSStringの最初の3文字を取得するには?
-
[解決済み] Category is implementing method which will be implemented by its primary class" の警告を抑制する。