2016-10-05 12 views
0

私は開発者ですので、tryブロックにコード全体をラップして、イベントログに書き込んだ後で心配することはありません。SwatchのCatchを試してみてください

私はちょうどHTMLページを解析し、テーブル内のリンクを探し、それらを抽出するためにカンナHTML/XMLポッドを使用して迅速

イムでキャッチラウンド私の頭を取得することはできません。イムは、トラブルが、私は常に// TD [2] // divの// [1]それはxpathでテーブルセル内のリンクがあることを知らないでこの

enum MyError: Error { 
    case FoundNil(String) 
} 

if let doc = Kanna.HTML(html: html, encoding: String.Encoding.utf8) 
{ 
    var count = 0 
    //loop through all instances of <tr> in the html 
    for row in doc.xpath("//tr") { 
     var linkName = "" 
     do{ 
      //get the <a> text from inside a <div> from the 2nd <td> 
      if let name = row?.xpath("//td[2]//div//a[1]")[count] 
      { 
       linkName = name.text 
      } 
      else{ 
       throw MyError.FoundNil("name") 
      } 
      count = count + 1 
     } 
     catch{ 
      print("Error: \(error)") 

     } 
    } 
} 

ようにそれをやって最初の数行のために働く、それは致命的なエラーで出てクラッシュし、

fatal error: Index out of range

それはキャッチまたは他の

に行かない私はまた、ガードを使用してみましたが、それはスローされません。いずれか

guard let name = row?.xpath("//td[2]//div//a[1]")[count] else{ 
    throw MyError.FoundNil("name") 
} 

と私は50個のテーブルセル をチェックするために必要であればコメントで述べたように、私はあなたが実行時例外をキャッチすることはできません、それらのすべて

+1

「範囲外のインデックス」または他のランタイムエラーSwiftでは、http://stackoverflow.com/questions/38737880/uncaught-error-exception-handling-in-swiftを比較してください。 –

+0

問題は、「致命的なエラー:インデックスが範囲外です。」例外ではなく、単にメッセージでクラッシュしているだけです。 Objective C/Swiftのアーチファクトは1回、 'fatalError'はstdlibのどこにでもあり、Swift 2 +' do/catch'を使用してキャッチすることはできません。ですから、 'iOS dev'にうまくいくと、そういうものがかなりよく見えます。 – user28434

+0

おかげで、多くのことが説明されています...図面ボードに戻って – Bicklp

答えて

0

にトライキャッチが必要になります。

しかし、あなたは私だけ答えていコンマ

+0

これを試してみます。別の方法で再加工しました。これ以上行にアクセスするカウントを使用していないので、 [カウント] – Bicklp

0

whereを置き換えるオプションのバインディングを使用し、スウィフト3では1行

if let name = row?.xpath("//td[2]//div//a[1]") where count < name.count { 
    linkName = name[count].text 
} 

で有効な範囲を確認することができ、キャッチ...試してみ指し..それは他の人たちの仕事にもなるかもしれない。このようにすることができます...

enum MyError: Error { 
    case FoundNil(String) 
} 
do{ 
if let doc = Kanna.HTML(html: html, encoding: String.Encoding.utf8) 
{ 
    var count = 0 
    //loop through all instances of <tr> in the html 
    for row in doc.xpath("//tr") 
    { 
     var linkName = "" 

      //get the <a> text from inside a <div> from the 2nd <td> 
      if let name = row?.xpath("//td[2]//div//a[1]")[count] 
      { 
       linkName = name.text 
      } 
      else{ 
       throw MyError.FoundNil("name") 
      } 
      count = count + 1 
     } 

} 
}catch{ 
      print("Error: \(error)") 

     } 

あなたはまだ助けが必要です。

+0

に戻っても問題はありませんが、これは範囲外の例外をキャッチしません。 – vadian

0

私はちょうどすべてのキャッチを取り除き、データにアクセスしていた方法を修正しました。 imは別のxpath値を使用して、私は配列にあったと思っていた場所ではなく、アクティブな行に直接、私はそれがちょうどいいと思う。現在の行の作業のように、すべてをソートしたxpathの始めに[count]は必要ありません。

let xpo = doc.xpath("//tr") as XPathObject 
let xCount = xpo.count 
var count = 0 
for row in xpo { 
    if (count <= xCount){ 
     var linkName = "" 

     for a in row.xpath(".//td[2]//div//a[1]") 
     { 
      linkName = a.text 
     } 
    } 
    count = count +1 
} 
関連する問題