Swift3/Xcode8でエラーハンドリングの練習

# エラー処理

エラーハンドリングの練習のために書き残しておきます。下記のUIButtonをクリックすると、エラーハンドリング処理が実行されるアプリです。引数に文字列を取り、その文字列でエラーを判定します。

<img width="206" alt="スクリーンショット 2017-05-20 16.56.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/fefd058d-9b8f-c1cb-a4d4-0debf43c87b2.png">



# 想定されるエラーをenmuで定義する

```swift 
enum TestError:Error {
        case Error1(String)
        case Error2(String)
        case Error3(String)
        case AnotherError(String)
    }
```

# 実行する関数を定義する

```swift
func TestMethod(str:String) throws {
        
              if str == "error1" {
            
            throw TestError.Error1("エラー発生1")
                
        }else if str == "error2" {
            
            throw TestError.Error2("エラー発生2")
                
        }else if str == "error3" {
            
            throw TestError.Error3("エラー発生3")
        }else{
                
            throw TestError.AnotherError("それ以外のエラー発生")
                
        }
       }
      }

```

# step3 実行する

```swift
do {
            try TestMethod(str: "error3")
            
        } catch TestError.Error1 (let err) {
            print (err)
            
        } catch TestError.Error2 (let err) {
            print (err)
            
        }catch TestError.Error3 (let err) {
            print (err)
            
        }catch TestError.AnotherError (let err) {
            print (err)
            
        }catch{
            
            print("何かがおかしい")
            
        }
```


# 実装

```ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func ErrHandlingTestButton(_ sender: Any) {
 
        do {
            try TestMethod(str: "error3")
            
        } catch TestError.Error1 (let err) {
            print (err)
            
        } catch TestError.Error2 (let err) {
            print (err)
            
        }catch TestError.Error3 (let err) {
            print (err)
            
        }catch TestError.AnotherError (let err) {
            print (err)
            
        }catch{
            
            print("何かがおかしい")
            
        }
    }
    
    
    enum TestError:Error {
        case Error1(String)
        case Error2(String)
        case Error3(String)
        case AnotherError(String)

    }
    

    
    func TestMethod(str:String) throws {
        
              if str == "error1" {
            
            throw TestError.Error1("エラー発生1")
                
        }else if str == "error2" {
            
            throw TestError.Error2("エラー発生2")
                
        }else if str == "error3" {
            
            throw TestError.Error3("エラー発生3")
        }else{
                
            throw TestError.AnotherError("それ以外のエラー発生")
                
        }
       }
      }

```




# 参考


[Swift,Objective-Cプログラミング ~ iOS ~](http://swift.swift-studying.com/entry/2015/08/28/082935)

[【Swift3.0】Errorプロトコルを使った例外処理のサンプルを作ってみた](http://anrakusan.hateblo.jp/entry/2017/03/04/221533)

[SwiftでのError Handlingを学び直す！byYutaka](http://sssslide.com/speakerdeck.com/tajitaji/swiftdefalseerror-handlingwoxue-bizhi-su)

[Swift3/Xcode8でエラーハンドリングの練習](http://off.tokyo/blog/2017/05/20/swift3xcode8%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E7%B7%B4%E7%BF%92/)


# GitHub

[Swift3-ErrorHandlingTutorial](https://github.com/Ryosuke-Hujisawa/Swift3-ErrorHandlingTutorial/tree/master)