Swift 15 Swift5のエラーハンドリング

# ⅩⅤ - Ⅰ Error Handling
今度こんどの章しょうにはError HandlingのError Type, throwing Method, function, guardとdefer syntax, そしてdo-catch 構文こうぶんなどと主題しゅだいについて説明せつめいします。
## Ⅰ-ⅰ　Error
Errorはただinternetが切れるきれるだけでも発生はっせいする事ことができます。
そしたら、アフリができることはしっかりErrorをHandlingすることです
例えたとえnetが弱くよわくなって切れるきれるとき、アフリを続くつづく使用しようすると活性かっせいされたinternet接続せつぞくが必要だと使用者がわかる様にします。
### throwing
エラーを処理する方法には二つがあります。１番目はIOSアフリないで欲しいな結果が出てなくて、エラーを`throwing`すること、２番目は`method`が`throwing`したエラーを捕まえて処理することです。
エラーを`throwing`する場合には、此れは自分の特性を識別して取る事ができる最も適切な動作を決定するのに使用される特定ターフの一つがなるはずです。
エラーターフ値はError `: Protocol`を従う全てになる事ができます。
アフリの中の`method`でエラーを`throwing`事も重要ですけど、IOS SDKの多いAPI`method`(特に、file処理と関連された`method`)も　コードのないで処理しなけれならないエラーを`throwing`する事も知っておくべきことです。

## Ⅰ-ⅱ 　Error 宣言する
例え、遠隔サーバfileを送信する`method()`があるとします。この`method`は色んな原因でパイル転送に失敗する可能性があります。この様全てのエラーは次の様にエラー`: Protocol`を従う`enum{}`の中で゛生成する事ができます。
```swift
enum FileTransferError: Error {
    case noConnection
    case lowBandwidth
    case fileNotFound
}
```
そして、エラーが発生するときに使う事ができます。

## Ⅰ - ⅱ 　Error Throwing 
`method`と　`func(){     }`がエラーを`throwing`する事を宣言する時には次の様にthrows keywordsを使います。
```swift
func transferFile() throws{ }
```
結果を返却する`method`とか`function`場合、`throws` キーワードは次の様に
```swift
func transferFile() throws -> Bool { }
```
エラーを`throwing`できる様に`method`を宣言したのでエラーが発生する時にはエラーnoticeを`throwing`する事ができはす。此れはthrow `Syntax`と`guard` `Syntax`を結合して、使える様にします。次のコードは提供される`let 　　`を宣言する後`method`についた`guard`動作と`throw`を実装されました。
```swift
let connectionOk = true
let connectionSpeed = 30.00
let fileFound = false

enum FileTransferError: Error {
    case noConnection
    case lowBandwidth
    case fileNotFound
}

func transferFile() throws{
    
    guard connectionOK else {
        throw FileTransferError.noConnection
    }
    guard connectionSpeed > 30 else {
        throw FileTransferError.lowBandwidth
    }
    guard fileFound else {
        throw FileTransferError.fileNotFound
    }
}

```
`method`内で有るそれぞれの`guard` `Syntax`は　各条件がtrueかfalseかを検査します。もし、嘘だったらelse `Syntax`で含まれた、コードが実行されます。上のコードでthrow `Syntax`を使って、fileTransferError `enum{}`で有る値の一つを投げたいます。

## Ⅰ-ⅲ Error Throwing
`method`または　`func()`が　エラーを`throwing`する様に宣言すると、一般的な方法としては呼び出す事ができません。次の様にtry`syntax`が必要です。
```swift
try fileTransfer()
```
try `syntax`を利用する方法以外にも`throw`された全てのエラーを捕まえて、処理するdo-catch`syntax`内で呼び出す方法もあります。例えば、`{method()}`を sendFileと言う名前の`method`内で
呼び出す必要があるとします。
```swift
func sendFile() -> String {
    do {
        try fileTransfer()
    } catch FileTransferError.noConnection {
        return("No Network Connectipon")
    } catch FileTransferError.lowBandwidth {
    } catch FileTransferError.fileNotFound {
        return("File not Found")
    } catch {
        return("Unknown Error")
    }
    return("Successful transfer")
}
```
この`method`は三つのエラー条件に対するcatchを含まれているdo-catch`syntax`についてfileTransfer`method`を呼び出します。この`method`は複数のエラーを対する該当エラーに対する説明を含まれている文字値を`↑ return`します。
    どんなエラーを発生無ければ、file伝送に成功しましたと文字`value`を`↑ return`します。４番目のcatch`clause`をエラーに対するパータンマッチングが行われていない状態に対するものである。此れは、`catch all` `syntax`で、前のcatch`syntax`と一致しない全てのエラーについて処理する様にくれます。
必ず必要なんですけど、do-catch `syntax`は可能できる全てのエラーについて処理させる様に構成しなければならないからです。
また、Swiftは , で区切ると、一つのcatch文内で複数の一致項目を宣言することもできます。　例えば、次の様に一つのcatch宣言を使用されてnoConnectionとlowBandwidthエラーを全部処理する事もできます。
```swift
func sendFile() -> String 
    do {
        try fileTransfer()
    } catch FileTransferError.noConnection, FileTransfer.lowBandwidth {
        return("Connection Problem")
```
## Ⅰ-ⅳ　エラー`Object:`に接近する
`{method()}`　`.Call`が失敗すると必ず失敗された原因を区別する事ができるエラー`Object:`が`↑ return`するはずです。`catch` `syntax`で　一番大事なことは、この`object`に対する接近して、アフリのコード内で取れる一番適当な動作を実行することです。次のコードは新しいfile system Directoryを生成する為にcatch`syntax`内で
エラー客体で接近する方法を見せます。
```swift
do{
    try filemgr.createDirectory(atPath: newDir,
                                withIntermidiateDirectories: true, attributes: nil)
} catch let error {
    print("Error: \(error.localizedDescription)")
}
```
ⅶⅷⅸⅹ
## Ⅰ-ⅴ　エラー catching無効化する
次の様に`try!`  `syntax`を使用するとdo-catch`syntax`内で`method`が呼び出される様に包まなくても`throwing` `{method()}`が　強制的に実行されます。
```swift
try! fileTranfer 
```
このような方法を使う事は`compiler`でこの`method call`はどんなエラーも発生ないだろう、と教えてくれるのと同じである。この様な方法を使ったのにエラーが発生すると、runtime Errorになるはずです。ですから、その様な方法はできれば使用ない様にしましょう。
## Ⅰ-ⅵ 　エラーdefer`syntax`
>? clause :a unit of grammatical organization next below the sentence in rank and in traditional grammar said to consist of a subject and predicate.
~ based on Latin claus- ‘shut, closed’, from the verb claudere 

前で実装された sendFile `method()`は エラーを処理する一般的なシナリオを見せます。do-catch`syntax`で有るそれぞれのcatch`clause ...{}`は 呼び出す`method()`制御権を返却する為に`↑ return` を盛り込みました。
だが、エラーの種類とは関係なく制御権を`↑ return`する前に何か別な作業をする為に、return 肛門を含まれました。例えば、sendFile`method()`には制御権を返却する為に前でtemporary fileを消去しなければならない場合が発生することがあります。此れはdefer`syntax`を使用すれば可能です。
defer`syntax`は`method()`が結果を`↑ return`する直前に実行されるべき一連のコードを指定されるようにします。
```swift
func sendFile() -> String {
    defer {
        removeTmpFiles()
        closeConnetion()
    }
    
    do {
        try fileTransfer()
    } catch FileTransferError.noConnection {
        return("No Network Connection")
    } catch FileTransferError.lowBandwidth {
        return("File Transfer Spped Too Low")
    } catch FileTransferError.fileNotFound {
        return("File not Found")
    } catch {
        return ("Unknown error")
    }
    return("Successful transfer")
}
```
只今defer`syntax`を追加したのでこの`method()`がどんな返却をしても制御権を`↑ return`する前にremoveTmpFiles`method()`とcloseconnection`method()`がいつも`↑ return`されます。

# 要約
エラーハンドリングは強くし安定的なIOSアフリを作る最も基本的なパートです。Swift2登場のおかげて、今はエラーを処理する事が安くなりました。
エラーターフはError `: Protocol`を従う値たちを利用して生成されると、`enum{}`みたいに実装する事が一番一般的です。エラーを`throw`する`method()`と`func(){     }` throw kewordを使って宣言されます。`guard`と`throw` `syntax`はエラーターフを基した　エラーを`throwing`するため`method()`とか`func(){     }`コード内で使われます。

エラーを`throw`する事ができる`method()`とか`func(){     }`はtry`syntax`を使って呼び出されて、必ず do-catch`syntax`で包まなればならないです。
do-catch `syntax`は徹底的に並べられたcatchパータンでこ構成されてそれぞれの　catch`syntax`は特定エラーで実行されるコードを入れます。`method()`が`↑ return`する時実行されるCleanUp作業はdefer`syntax`を使って定義される事ができます。