2016-08-25 3 views
0

예외 대신이 메서드를 사용하여 예외를 처리 할 수 ​​있습니까?자신의 메서드에서 예외를 처리하는 방법

items.each do |item| 
    begin 
    url = item.url 
    page = Nokogiri::HTML(open(url).read) 
    rescue Exception => e 
    puts "Couldn't read \"#{ url }\": #{ e }" 
    else 
    title = get_title(page) 
    end 
end 

뭔가 같은 :

def get_page(url) 
    begin 
    Nokogiri::HTML(open(url).read) 
    rescue Exception => e 
    puts "Couldn't read \"#{ url }\": #{ e }" 
    end 
end 

#and then call: 

items.each do |item| 
get_page(url) 
title = get_title(page) 
end 

가 어디는 else 절을 배치해야합니까?

+0

이것은 노코 기리의 문제가 아닙니다, 그것은 질문을 처리 루비 예외입니다. –

+0

@theTinMan 제 생각에는 루비 문제입니다. 잘못된 제목이나 태그를 사용 했습니까? –

+0

Nokogiri로 태그를 지정했습니다. 코드에서 Nokogiri가 언급되었지만 예외를 처리하는 것이 중요하지는 않습니다. 이것이 Nokogiri 특정 예외를 처리하는 것이라면 Nokogiri를 태그 지정하는 것이 타당합니다. 그렇지 않으면 OpenURI 또는 ​​Kernel에 태그를 지정하는 것이 파일을 읽는 예외를 발생시키는'open' 동작을 제공하기 때문에 더 합리적입니다. 그것은 당신의 코드를 이해하고 보석/라이브러리가 무엇을 공급하는지에 관한 것입니다. –

답변

1

시작하려면 거의 Exception에서 구출하고 싶지 않습니다. 대신 StandardError (또는 특정 오류)에서 구하십시오. Exception은 조상이고 StandardError이며 복구 할 수없는 오류가 있습니다 (메모리 오류, 구문 오류 등).

당신은 노코 기리 구문 분석 오류의 모든 유형이 StandardError에서 상속해야 표준 오류 또는

rescue StandardError => e 

에서 구출

rescue => e 

를 사용할 수 있습니다. Net/HTTP는 좀 더 문제가 있습니다. "What’s the best way to handle exceptions from Net::HTTP?"을 참조하십시오. 단, 개별적으로 구출 할 수는 있습니다.

질문에 답변드립니다. 당신은 당신의 get_page 방법에서 nil을 반환하고 get_page의 결과가 타이틀을 얻기 전에 nil을 있는지 확인할 수 있습니다 :

def get_page(url) 
    Nokogiri::HTML(open(url).read) 
rescue => e 
    puts "Couldn't read \"#{ url }\": #{ e }" 
    nil 
end 

items.each do |item| 
    url = item.url 
    page = get_page(url) 

    if page 
    title = get_title(page) 
    end 
end 
+0

좋은 답변입니다. 코드를 편집하고 Exception => e로 변경하십시오. –

+0

코드에서 Exception을 제거했습니다. – kcdragon

관련 문제