2017-12-11 5 views
0

私のコードでは、SWXMLHashライブラリを使用していくつかのXMLをデシリアライズしています。その.value()メソッドは、任意のカスタムデシリアライズ関数と同様に、宣言にthrowsというキーワードを持っています。Swift:エラーがtry文を無視します

私は次のコード行があります。ライブラリはUInt8ためのデシリアライザが含まれていませんので

let myValue : UInt8 = try? xml["Root"]["ValueNode"].value() 

を、私は私自身を定義した:ときノード

extension UInt8: XMLElementDeserializable { 
    public static func deserialize(_ element: XMLElement) throws -> UInt8 { 
     return UInt8(element.text)! 
    } 
} 

これは動作します値があります。ノードが存在しないかnilでないときただし、エラーは次の行で発生します

return UInt8(element.text)! // Fatal error: Unexpectedly found nil while unwrapping an Optional value 

これは明らかに、起こることになっています。なぜ私はこのエラーが私のtry?ステートメントでキャッチされず、そのエラーをスローする代わりにnilを返すのか理解できません。

誰でも手助けできますか?

+0

'throws'と' try'を使って致命的なエラーに対処することはできませんが、それは致命的です。オプションを扱うためにSwiftに組み込まれた適切な方法があります。 – rmaddy

+0

これはかなり前に数回適用されています:https://stackoverflow.com/a/372​​22884/2976878、https://stackoverflow.com/a/38738365/2976878、https:// stackoverflow。com/q/46866311/2976878、https://stackoverflow.com/q/31335023/2976878&https://stackoverflow.com/q/43009744/2976878を参照してください。 – Hamish

答えて

1

すべてのエラーがSwiftで検出されるわけではありません。 throwsキーワードを使用して関数にマークを付けると、関数がを回復可能なエラーをスローする可能性があることを示します。ただし、カスタム実装では実際にエラーは発生しません。 throwキーワードでマークされ、コードthrow Errorを使用してスローされた関数からスローされたエラーのみが、do-catchブロックによって捕捉されます。

try?は、スロー可能な関数の戻り値をオプションに変換する方法です。関数がエラーをスローすると、try?の後の値はnilになります。それ以外の場合は任意の値になります。

!を使用するときは、具体的にあなたが何をしているのかをコンパイラに伝え、!を使用した操作が失敗した場合、アプリケーションはうまく失敗しません。

deserializeメソッドを変更して、オプションのアンラップを正常に処理するか、throwとエラーを処理する必要があります。

extension UInt8: XMLElementDeserializable { 
    public static func deserialize(_ element: XMLElement) throws -> UInt8 { 
     if let val = UInt8(element.text) { 
      return val 
     } else { 
      throw NSError(domain: "Couldn't deserialize value to UInt8", code: 1) 
     } 
    } 
} 
1
return UInt8(element.text)! 

この行には、tryはありません。したがって、ここにはエラーはスローされません。 UInt8が与えられた文字列を変換できない場合は、nilを返します。そして、もちろん、あなたの!はそれをnilにクラッシュさせます。その代わりの

は、代わりにこのような何かを:一般的に

guard let retVal = UInt8(element.text) else { throw SomeError } 
return retVal 

!を使って何かをする方法、および!を使用せずに同じことを行うための別の方法があります場合には、第二のために行きます本当に良い理由がない限り、1つです。

関連する問題