6

Interesuję się z CampaignMonitor's API przy użyciu ruby wrapper (createsend-ruby) i po prostu zastanawiam się, co poleciłbyś w zakresie obsługi błędów/wyjątków. Myślałem o używaniu początku/ratowania/kończenia w następujący sposób, ale chcę tylko wiedzieć, czy istnieją lepsze techniki tego typu (gdy mamy do czynienia z interfejsem API innej firmy).Jak obsługiwać błędy/wyjątki podczas wywoływania zewnętrznego interfejsu API w Ruby on Rails?

begin 
    list_id = CreateSend::List.create client_id, title, unsubscribe_page, confirmed_opt_in, confirmation_success_page 
rescue Exception => e 
    logger.error "[error] CampaignMonitor error: #{e}" 
    return false 
end 

Na przykład, czy próbowałbyś wychwycić określone wyjątki i radzić sobie z nimi indywidualnie?

rescue CreateSend::BadRequest => e 

Czy to tylko kwestia indywidualnych preferencji i/lub wymagań aplikacji?

Dziękuję za poświęcony czas!

Odpowiedz

7

Zwykle zaczynam od jednego wyjątku, aby złapać je wszystkie i przejść od tego miejsca. Jeśli pojawia się szczególny błąd, który często pojawia się lub wymaga innego traktowania niż inny, po prostu dodaj kolejny blok ratunkowy powyżej dolnego, aby wyjątek został złapany. Robisz to dobrze :)

Unikaj rescue Exception, gdy to możliwe, prosty rescue powinien załatwić sprawę.

Właśnie w celu wyjaśnienia, można mieć dowolną liczbę ratuje jak również zapewnić:

begin 
    do_something 
rescue CS::BadRequest => e 
    logger.error "..." 
rescue CS::TimeoutError => e 
    do_something_that_retries 
rescue => e 
    logger.error "..." 
ensure 
    send_email_to_admin 
end 
+0

mógłbyś łaskawie wyjaśnić dlaczego * * 'rescue Exception' należy unikać, jeśli to możliwe (i po prostu' rescue' sam należy użyć)? Ponadto, kiedy nie można uniknąć określenia "wyjątku"? – user664833

+4

'rescue' na własne uratowanie z' StandardError' i jego dzieci, to wszystko, czego potrzebujesz 99% czasu, podczas gdy 'rescue Exception' idzie wyżej w górę łańcucha i ratuje od sygnałów, wyjść systemu, brak błędów pamięci i skryptu błędy. O ile nie używasz 'wyjątku ratunkowego' z konkretnego powodu, nie powinieneś go używać. – bensie