Article

Handling Cocoa Errors in Swift CocoaエラーをSwiftにおいて処理する

Throw and catch errors that use Cocoa's error types. Cocoaのエラー型を使うエラーをスローおよびキャッチします。

Overview 概要

You use Swift's throw statement and do-catch statement to throw and catch errors from Cocoa APIs. Swift imports Cocoa methods with error parameters as throwing methods, as described in About Imported Cocoa Error Parameters. あなたは、Swiftの持つthrow文とdo-catch文を使って、Cocoa APIからのエラーをスローおよびキャッチします。Swiftは、エラーパラメータを持つCocoaメソッドをスローメソッドとしてインポートします、インポートされるCocoaエラーパラメータについてで記述されるように。

Catch Errors エラーをキャッチする

In Swift, calling a method that throws requires explicit error handling. Because Cocoa methods with errors parameters are imported as throwing methods, you handle them using Swift's do-catch statement. スウィフトでは、スローするメソッドを呼び出すことは明確にエラー処理することを必要とします。エラーパラメータを持つCocoaメソッドはスローメソッドとしてインポートされることから、あなたはそれらをSwiftのdo-catch文で処理できます。

Here’s an example of how you handle an error when calling a method in Objective-C: ここに、メソッドをObejctive-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);
}

Here's how you handle the same error in Swift: ここに、あなたが同じエラーを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)")
}

You can also use the do-catch statement to match on specific Cocoa error codes to differentiate possible failure conditions: あなたはまた、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 Errors エラーをスローする

You throw Cocoa errors by initializing a Cocoa error type and passing in the relevant error domain and code: あなたは、Cocoaエラーのスローを、あるCocoaエラー型を初期化して、関連エラー領域およびコードを渡すことによって行います:


throw NSError(domain: NSURLErrorDomain, code: NSURLErrorCannotOpenFile, userInfo: nil)

If Objective-C code calls a Swift method that throws an error, the error is automatically propagated to the error pointer argument of the bridged Objective-C method. Objective-Cコードがエラーをスローするスウィフトメソッドを呼ぶならば、そのエラーはブリッジされたObjective-Cメソッドのエラーポインタ引数に自動的に伝達されます。

Throw and Catch Errors from Custom Error Domains あつらえのエラー領域からエラーをスローおよびキャッチする

You use custom error domains in Cocoa to group related categories of errors. The example below uses the NS_ERROR_ENUM macro to group error constants: あなたは、あつらえのエラー領域をCocoaにおいて使用して、関連するエラーのカテゴリをグループにまとめます。下の例は、NS_ERROR_ENUMマクロを使ってエラー定数をグループにまとめます:


extern NSErrorDomain const MyErrorDomain;
typedef NS_ERROR_ENUM(MyErrorDomain, MyError) {
    specificError1 = 0,
    specificError2 = 1
};

This example shows how to throw errors using that custom error type in Swift: この例は、そのあつらえのエラー型をSwiftで使って、エラーをスローする方法を示します:


func customThrow() throws {
    throw NSError(
        domain: MyErrorDomain,
        code: MyError.specificError2.rawValue,
        userInfo: [
            NSLocalizedDescriptionKey: "A customized error from MyErrorDomain."
        ]
    )
}

This example shows how to catch errors from a particular error domain and bring attention to unhandled errors from other error domains: この例は、特定のエラー領域からのエラーをキャッチする、そして他のエラー領域からの処理できないエラーへの注意をもたらす方法を示します:


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."
} catch let error {
    fatalError("Some other error: \(error)")
}

Handle Exceptions in Objective-C Only Objective-Cにだけしかない例外を処理する

In Objective-C, exceptions are distinct from errors. Objective-C exception handling uses the @try, @catch, and @throw syntax to indicate unrecoverable programmer errors. This is distinct from the Cocoa pattern—described above—that uses a trailing NSError parameter to indicate recoverable errors that you plan for during development. Objective-Cにおいて、例外はエラーとは別個のものです。Objective-C例外処理は、@try@catch、そして@throw構文を使って回復不可能なプログラマエラーを指し示します。これは、— 上で記述される — Cocoaパターンとは別個のものです、それは後に続くNSErrorパラメータを使って、あなたが開発の間に対策を立てる解決可能なエラーを指し示します、

In Swift, you can recover from errors passed using Cocoa’s error pattern, as described above in Catch Errors. However, there’s no safe way to recover from Objective-C exceptions in Swift. To handle Objective-C exceptions, write Objective-C code that catches exceptions before they reach any Swift code. Swiftでは、あなたはCocoaのエラーパターンを使って渡されるエラーから復旧できます、上のエラーをキャッチするで記述されるように。しかしながら、スウィフトにはObjective-C例外から回復する安全な方法はありません。Objective-C例外を取り扱うには、それら例外をそれらが何らかのスウィフトコードに届く前に捕まえるObjective-Cコードを書いてください。

See Also 参照

Common Patterns 共通パターン