文書   >   Swift   >  Cocoa Design Patterns   >   Handling Cocoa Errors in Swift
記事
Handling Cocoa Errors in Swift
(Swift での Cocoa のエラーの処理)
Cocoa のエラーの型を使用するエラーを throw してキャッチします。
概観
Swift の throw 文と do-catch 文を使用して、Cocoa API からエラーを throw およびキャッチできます。Swift は、インポートされた Cocoa エラーパラメータについて で説明したように、error パラメータを含む Cocoa メソッドを throw メソッドとしてインポートします。
Error をキャッチする
Swift では、throw するメソッドを呼び出すには、明示的なエラー処理が必要です。error パラメータを持つ Cocoa メソッドは、throw するメソッドとしてインポートされるため、Swift の do-catch 文を使用してそれらを処理して下さい。
以下に、Objective-C でメソッドを呼び出すときにエラーを処理する方法の例を示します。
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *fromURL = [NSURL fileURLWithPath:@"/path/to/old"];
NSURL *toURL = [NSURL fileURLWithPath:@"/path/to/new"];
NSError *error = nil;
BOOL success = [fileManager moveItemAtURL:fromURL toURL:toURL error:&error];
if (!success) {
NSLog(@"Error: %@", error.domain);
}
Swift で同じエラーを処理する方法は以下のとおりです。
let fileManager = FileManager.default
let fromURL = URL(fileURLWithPath: "/path/to/old")
let toURL = URL(fileURLWithPath: "/path/to/new")
do {
try fileManager.moveItem(at: fromURL, to: toURL)
} catch let error as NSError {
print("Error: \(error.domain)")
}
また、do-catch 文を使用して特定の Cocoa エラーコードを照合し、考えられる障害条件を区別することもできます。
do {
try fileManager.moveItem(at: fromURL, to: toURL)
} catch CocoaError.fileNoSuchFile {
print("Error: no such file exists")
} catch CocoaError.fileReadUnsupportedScheme {
print("Error: unsupported scheme (should be 'file://')")
}
エラーを Throw する
Cocoa のエラー型を初期化し、関連するエラードメインとコードを渡すことにより、Cocoa のエラーを throw して下さい。
throw NSError(domain: NSURLErrorDomain, code: NSURLErrorCannotOpenFile, userInfo: nil)
Objective-C コードがエラーを throw する Swift のメソッドを呼び出す場合、エラーは自動的に、ブリッジされた Objective-C メソッドのエラーポインタ引数に伝播されます。
カスタム のエラードメインからエラーを throw し、キャッチする
Cocoa 内のカスタムのエラードメインを使用して、エラーの関連したカテゴリをグループ化して下さい。以下の例では、NS_ERROR_ENUM マクロを使用してエラー定数をグループ化しています。
extern NSErrorDomain const MyErrorDomain;
typedef NS_ERROR_ENUM(MyErrorDomain, MyError) {
specificError1 = 0,
specificError2 = 1
};
以下の例では、Swift でそのカスタムエラー型を使用してエラーを throw する方法を示しています。
func customThrow() throws {
throw NSError(
domain: MyErrorDomain,
code: MyError.specificError2.rawValue,
userInfo: [
NSLocalizedDescriptionKey: "A customized error from MyErrorDomain."
]
)
}
以下の例では、特定のエラードメインからエラーをキャッチし、他のエラードメインからの未処理のエラーに注意を引く方法を示しています。
do {
try customThrow()
} catch MyError.specificError1 {
print("Caught specific error #1")
} catch let error as MyError where error.code == .specificError2 {
print("Caught specific error #2, ", error.localizedDescription)
// Prints "Caught specific error #2. A customized error from MyErrorDomain."
} let error {
fatalError("Some other error: \(error)")
}
Objective-C のみで例外を処理する
Objective-C では、例外はエラーとは異なります。Objective-C では、@ try、@ catch、および @throw 構文を使用して、回復不能なプログラマーエラーの例外処理をします。これは、上記で説明した Cocoa パターンとは異なり、Cocoa パターンは、末尾の NSError パラメーターを使用して、開発中に計画する回復可能なエラーを示します。
Swift では、上記の Error をキャッチする で説明したように、Cocoa のエラーパターンを使用して渡されたエラーから回復できます。ただし、Swift 内の Objective-C 例外から回復する安全な方法はありません。Objective-C 例外を処理するには、Swift コードに到達する前に例外をキャッチする Objective-C コードを記述して下さい。
以下も見よ
共通のパターン
- Using Key-Value Observing in Swift
(Swift でキー値監視を使用する) - Using Delegates to Customize Object Behavior
(カスタム化されたオブジェクトの動作にデリゲートを使用する) - Managing a Shared Resource Using a Singleton
(シングルトンを使用して共有リソースの管理) - About Imported Cocoa Error Parameters
(インポートされた Cocoa のエラーパラメータについて)
他のオブジェクトのプロパティの変更についてオブジェクトに通知します。
委任者に代わってイベントに応答します。
単一の、共有化されたクラスインスタンスを使用して、共有リソースへのアクセスを提供します。
Cocoa のエラーパラメータが Swift の throw するメソッドにどのように変換されるかを学びます。
トップへ(Swift 標準ライブラリ)
トップへ(Swift 標準ライブラリ)
トップへ(Swift 標準ライブラリ)
トップへ(Swift 標準ライブラリ)
トップへ(Swift 標準ライブラリ)
トップへ(Swift 標準ライブラリ)