文書   >   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 コードを記述して下さい。



以下も見よ





共通のパターン

















トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)












トップへ(Swift 標準ライブラリ)
目次
Xcode 11 の新機能

Swift 標準ライブラリ
  • 概観
  • 以下も見よ












  • トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)