2012-03-10 18 views
0

私は、短くなったURLのリスト(一度に2,000〜3,000程度)をループするRubyスクリプトを持っています。現時点では、すべてが桃色ですが、不正な形式のURL、タイムアウトなどが発生します。エラーが発生すると、スクリプトが消えます。このようなエラーが発生した場合、どのようにループを設定して次のレコードにスキップすることができますか?ループ内のRuby例外

私のループは次のようになります。

def mymethod(barurl) 
    begin 
    stuff 
    ... 
    return expandedurl 
    rescue 
    return "Problem expanding link" 
    end 
end 

私開始する必要があります/エンド・ロジックは、私のループの代わりに、方法に巻き付けさ:

blah.foo do |barurl| 
    mymethod(barurl) 

私にmymethodはこのようになりますか?

答えて

9

を使用して、ループ内でスキップ設定する必要があります不正なURL、あなたは例外

def mymethod(barurl) 
    stuff 
    ... 
    raise YourTypeOfException, "this url is not valid" 
    ... 
end 
1

はい。すべてのメソッドが例外を消費し、エラーを示すために別の任意のオブジェクトを返します。

あなたのメソッドは、独自の例外条件を処理すべきではありません。呼び出し元がどのように反応するかを前提にするのは、その部分では失礼です。

blah.foo do |url| 
    begin 
    my_method url 
    rescue 
    next 
    end 
end 

次のURLにスキップするのか、メッセージを印刷するのかは、方法が決定するべきではありません。その唯一の懸念事項はURLで作業する必要があります。

これで、実際に対処できるときに伝播させてから救助するだけでいいはずです。あなたができることならTimeoutErrorから救助しないでください。返信は:timeoutです。

リソースをクリーンアップする必要があるときにレスキューするか、エラーが発生したことをユーザーに知らせるだけです。

また、すべての可能なエラーから救済するだけで、バグを導入するうえで便利です。できるだけ具体的にする。

+0

時間を上げるループ

blah.foo do |barurl| begin mymethod(barurl) rescue YourTypeOfException next end end 

とメソッドの内部を制御するために例外メッセージを使用する必要がありますあなたの答えはDaveとkeymone noの両方に矛盾すると思いますか?多分、私は何かが欠けているかもしれない。 –

1

内部ループループの構造は例外で終了しません。しかし、すでにそうであるように見えます。例外の原因となるメソッドの中で救助している場合、ループは例外を認識すべきではないため、正常に継続しているはずです。あなたのメソッド内で例外処理を持つ

+0

それは私がDaveと思っていたものですが、私のループは例外を見て壊れています。私は戻って私の例外処理を見なければならないかもしれません。 –

+0

@EdBloom例外トレースとその意味を理解するのに十分なコンテキストを含めると、追加のヘルプが可能になります。あなたはそれがURLであると仮定して戻り値に行動しますか? –

0

はそれを行うための適切な方法であるので、あなたの実装が

結構です私はあなたにいくつかのルビーsytax砂糖を指すことができます:

def some_method 
    # here goes the code 
rescue Exception => e 
    # here goes specific exception/error handling 
rescue 
    # here goes error handling (not Exception handling though!) 
else 
    # this block is kind of like previous, just for semantics 
ensure 
    # this is to be executed after method and exception handling bodies 
end 

ところであなたは必要ありません。 return文、コードブロックの最後の値は、常に私は「どのように次のレコードをスキップする」

であなたの質問を読み違えると思う暗黙的

ああ返されます210

あなたが間違っていた現在の1の後のレコードをスキップしたい場合はスキップする必要があるため、あなたの構文解析メソッドからエラーコードを返し、breakまたはnextキーワード

+0

チップのお返事ありがとう:return文keymone –

関連する問題