MASTG-KNOW-0065 例外処理 (Exception Handling)
例外はアプリケーションが正常ではない状態やエラーのある状態になった場合によく発生します。 例外処理のテストとは、ログ出力メカニズムや UI を介して機密情報を開示することなく、アプリケーションが例外を処理して安全な状態になることを確認することです。
但し、Objective-C の例外処理は Swift とはまったく異なることに注意します。従来の Objective-C コードと Swift コードの両方で書かれたアプリケーションで二つの概念を橋渡しすることは問題になる可能性があります。
Objective-C の例外処理
Objective-C には二種類のエラーがあります。
NSException:
NSException はプログラミングエラーや低レベルエラー (0 による除算、配列の境界外アクセスなど) を処理するために使用されます。 NSException は raise によりレイズされるか、または @throw でスローされます。catch されない場合、この例外は unhandled 例外ハンドラを呼び出し、ステートメントをログ出力します (ログ出力はプログラムを停止します) 。@try-@catch ブロックを使用している場合、@catch はその例外から回復できます。
@try {
//do work here
}
@catch (NSException *e) {
//recover from exception
}
@finally {
//cleanupNSException の使用にはメモリ管理の落とし穴があることに気をつけます。finally ブロック 内で try ブロックでの 割り当てをクリーンアップする 必要があります。@catch ブロックで NSError をインスタンス化することにより NSException オブジェクトを NSError に変換できることに注意します。
NSError:
NSError は他のすべてのタイプの エラー に使用されます。Cocoa フレームワークの一部の API では何らかの問題が発生した場合に失敗時コールバックのオブジェクトしてエラーを提供します。それらを提供しないものは NSError オブジェクトへのポインタを参照渡しします。成功または失敗を示す NSError オブジェクトへのポインタを取るメソッドに、BOOL の戻り値型を提供することはよい習慣です。戻り値の型がある場合、エラーの場合に nil を戻すことを確認します。NO または nil が戻される場合には、エラーや失敗の理由を調べることができます。
Swift の例外処理
Swift (2~5) の例外処理はまったく異なります。try-catch ブロックは NSException を処理するためのものではありません。そのブロックは Error (Swift 3) または ErrorType (Swift 2) プロトコルに準拠するエラーを処理するために使用されます。一つのアプリケーション内で Objective-C と Swift コードを組み合わせる場合、これは困難になることがあります。したがって、両方の言語で書かれたプログラムでは NSException よりも NSError が好まれます。さらに、Objective-C ではエラー処理はオプトインですが、Swift では明示的に throws を処理する必要があります。エラーを throw する際の変換には、Apple のドキュメント をご覧ください。 エラーを throw するメソッドは throws キーワードを使用します。Result タイプは成功または失敗を表します。Result, Swift 5 での Result の使用方法, Swift での Result タイプの威力 を参照してください。Swift でエラーを処理する 方法は四つあります。
関数からその関数を呼び出すコードにエラーを伝えることができます。この場合、
do-catchはありません。単に実際のエラーを throw するthrowがあるか、throw するメソッドを実行するtryがあります。tryを含むメソッドにはthrowsキーワードも必要です。
do-catch文を使用してエラーを処理します。ここでは以下のパターンを使用できます。エラーを optional 値として処理します。
try!式を使用して、エラーが発生しないことを assert します。一般的なエラーを
Result戻り値として処理します。
ネットワークおよび JSON デコーディングエラーを
Resultタイプで処理します。
Last updated
Was this helpful?