1. ホーム
  2. objective-c

Objective-C。アサーション vs. 例外 vs. エラー

2023-09-23 07:23:56

質問

Cocoaでは、いつNSAssert、NSException、NSErrorを使うべきですか?

以下は、私が考えたことです。

NSAssert - プログラマ自身の利益のために使用される任意のクライアントプログラムを作成するときに、ルール、規約、仮定、または事前条件と事後条件をダブルチェックしますか?

NSException - サードパーティライブラリを作成する際、そのライブラリを使用する他のプログラマのために、入力が無効な場合にすぐに分かるようにするため?

NSError - ファイル、データベース、Webサービスなど、外部システムと連携してデータを取得する場合、結果が保証されていないのでは?

どのように解決するのですか?

このような場合 NSAssert は失敗すると例外を投げます。だから NSAssert は、あなたがコードで作った仮定をチェックするための、短くて簡単な方法として存在するのです。例外の代替ではなく、単なる近道だと私は考えています。もしアサーションが失敗したら、あなたのコードの中で何かがひどく間違っていることになり、プログラムを続行してはいけません。

注意すべき点は、NSAssert はリリースビルドではあなたのコードにコンパイルされないので、これは通常、開発中のサニティチェックのために使用されるということです。私は実際には、常にアクティブであるカスタム アサート マクロを使用する傾向があります。

あなたが @throw 自分の NSException は、リリースビルドで絶対に必要な場合、およびパブリックライブラリ/インターフェースのようなもので、いくつかの引数が無効であるか、間違って呼び出された場合に使用されます。標準的な慣習として @catch で例外を発生させ、アプリケーションの実行を継続させるというのは、実は標準的なやり方ではないことに注意してください。Appleの標準ライブラリ(例えばCore Data)でこれを試すと、悪いことが起こるかもしれません。アサートと同様に、例外がスローされた場合は、どこかにプログラミング エラーがあることを意味するため、一般にアプリはかなり迅速に終了するはずです。

NSErrors は、プログラミングエラーでない、回復可能なエラーのために、ライブラリ/インターフェースで使用されるべきです。呼び出し側に情報/エラーコードを提供することができ、呼び出し側はエラーをきれいに処理し、必要に応じてユーザーに警告し、実行を継続することができます。これは通常、File-not-found エラーやその他の非致命的なエラーのようなものです。