2017-12-10 19 views
0

オーバーライドされたメソッド、デリゲートメソッド、またはdataSourceメソッドなどの投げられない関数のエラー処理に問題があります。私はエラーを記録することを思いついただけで、これは良いエラー処理戦略ではありません。他の方法やアプローチなどはありますか?ありがとうございました。Swiftの非投げ込み関数でのエラー処理

EDIT:

enum SomethingError : Error{ 
    case somethingFailed 
} 

var anObject : AnObject? 

........ 
........ 


public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell throws{ 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) 

     guard let anObject = anObject else{ 
      throw SomethingError.somethingFailed 
      //and maybe return unprocessed cell but you cannot return anything after "throw", or you cannot "throw" after "return" 
     } 

     ..... 
     ..... 

     return cell 
} 

あなたがいるので、このような何かを行うことはできません。collectionView:cellForItemAt:indexPathが投げ関数ではありません、それはセルを返す必要があります。ここでエラーをどのように捕捉できますか?これが問題です。ロギング経由でのみ?

編集:私が使用できることを知っていますif letしかし私はキャッチしたい/投げる;ここにエラーを処理してください。

+0

具体的な例が参考になります。 –

+0

「エラー」が発生していないので定義しますか?メソッドの例はありますか? – Larme

+1

あなたは** cellForItem'でエラーを** 'スローすることはできませんが、スローされたエラーを' catch'することはできます。基本的に、スコープを終了できるデリゲートとデータソースメソッド内のコードは避けてください。 – vadian

答えて

1

明示的に必要としないプロトコルの実装でエラーを伝播することはできません。

同じ実装でそれらをthrow/catchにすることもできますし、単にエラーを処理するメソッドを呼び出すこともできます。

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell throws{ 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) 

     do { 

      guard let anObject = anObject else{ 
       throw SomethingError.somethingFailed 
       //and maybe return unprocessed cell but you cannot return anything after "throw", or you cannot "throw" after "return" 
     } catch SomethingError.somethingFailed { 
      // handle the error here 
     } 

     ..... 
     ..... 

     return cell 
} 

そして、ちょうど機能と、それはこのようなものになります:エラー処理あなたが読むことができる迅速で詳細については

func handleError() { 
    // handle error 
} 

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell throws{ 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) 

     guard let anObject = anObject else{ 
      handleError() 
      return 
     } 

     ..... 
     ..... 

     return cell 
} 

The Swift Programming Language: Error Handlingあなたの例では、このようthrow/catchを使用することができます

関連する問題