2011-07-14 8 views
-3

Perl APIを使用してウェブサイトからデータを抽出しようとしています。私はURIのリストを使ってウェブサイトからデータを取得しています。eval {}文のスキップエラー

最初は問題はif there was no data available for the URI it would dieだったので、その特定のURIをスキップして次の利用可能なURIに移動したいと思っていました。この問題を解決するためにnext unless ....;を使用しました。

ここで問題は、特定のメソッド(identifiers()と呼ばれる)をAPIから呼び出して、Webから特定のデータを抽出しようとしていることです。現在、データはURIに対して利用可能ですが、私が探している特定のデータ(識別子)は利用できず、死にます。

私はeval{}

このよう
eval { 
    for $bar ($foo->identifiers()){ 
     #do something 
    }; 
} 

を使用しようとした私はeval{}を使用する場合、私はそれがエラーをスキップして先に動くと思いますが、私はわかりません。エラーはInvalid content type in response:text/plainです。

私はURIを手動でチェックしましたが、識別子はありませんが、残りのデータがあります。これをスキップして次のURIに移動します。どうやってやるの?

答えて

3

OK、私はあなたの質問を理解していると思いますが、Perl APIを指定するのと同じように、もう少しコードが助けになるでしょう - それは重要ではないようですが、あなたの質問の大きな部分です。それを言って、問題は非常に簡単に思える。

Perlはほとんどの言語のようにエラーを検出すると、エラーを処理できる場所が見つかるまで、呼び出しコンテキストを順番に実行します。 Perlの最も基本的なエラー処理はeval{}です(ただし、できればTry::Tinyを使用します。これは、evalが行うことができる他の奇妙なものの代わりにエラー処理を行うことを明確にしているからです)。

とにかく、Perlがeval{}に達すると、eval{}の全体が終了し、$&がエラーに設定されます。したがって、eval{}をループ外に置くと、エラーがループを離れます。 eval{}ループ内に置くと、エラーが発生したときにはeval{}は終了しますが、次の繰り返しに進みます。それは簡単です。

use strict;use warnings;を使用していない可能性がある兆候も検出します。彼らはあなたがより多くのバグをより早く見つけるのを助けるので、してください。

+0

あなたの答えに感謝します。さて、私が使用しているAPIはConnotea Perl APIです。そして、私は厳密に使用しました。警告を使用する。そのアドバイスをありがとう。さらに私が得るエラーは、応答で無効なコンテンツタイプです:mycode行41のtext/htmlと私のコード(私のプログラム)の41行は、実際にはWebからのデータです。以前のurisではうまく動作するので、コードにエラーはないことがわかりました。さて、私はこのエラーを修正し、次のuriに移動するにはどうすればよいですか?私のプログラムはこのエラーを抱えています。 – sammed

+0

OK、Connotea PerlはLWP :: UserAgentではありません。 RDF MIMEタイプ、つまりapplication/xmlまたはapplication/rdf + xmlのみを受け入れます。 text/htmlはどちらでもないので、エラーがどこから来るのかが分かります。この場合、サーバーはコンテンツがRDFでない(XMLではないため)ことを示しています。あなたはおそらく、Try :: Tinyまたはこれを守るためにほぼすべてのConnotea Perlコードを評価する必要があります。 –