2013-03-13 4 views
13

최근에 뭔가 잘못되었을 때를 대비해 코드 줄에 rescue을 사용할 수 있다는 것을 알게되었습니다 (http://www.rubyinside.com/21-ruby-tricks-902.html 팁 21 참조). 나는 같이하는 데 사용되는 몇 가지 코드를 가지고 :Ruby Oneline Rescue

rescue 방법으로
if obj['key'] && obj['key']['key2'] && obj['key']['key2']['name'] 
    name = obj['key']['key2']['name'] 
else 
    name = '' 
end 

, 나는 이런 식으로 뭔가에 그 코드를 변경할 수 있다고 생각하십시오 전무 예외가 어떤 던져 경우

name = obj['key']['key2']['name'] rescue '' 

레벨을 해시에 접근하면, 구조에 의해 잡히고, 저에게 줘야합니다. 원하는 동작이 있다면 이름을 nil으로 설정할 수도 있습니다.

이렇게하는 데 알려진 위험이 있습니까? 이 사실이 너무 좋기 때문에 나는 묻는다. 첫 번째 코드 예제처럼 보이지 않게 너무나 추한 코드가 있습니다.

+0

, 인라인에게'구조 '안전하다. I/O 오류 또는 데이터베이스 정보 누락으로 인해 다른 메소드가 예외를 발생시킬 수있는 메소드 호출이 끝날 때이 메소드를 사용할 때주의하십시오. 이러한 상황을 디버깅하는 것은 정말 어렵고 어렵습니다. –

답변

11

읽기 좋습니다! 그러나 그것은 당신의 성과에 영향을 미칠 것입니다. 내 경험에 의하면 rescue은 트리거 될 때 속도가 훨씬 느리고 그렇지 않을 때는 약간 느려집니다. 모든 경우에 if이 빠릅니다. 고려해야 할 다른 사항은 예외가 예상되어서는 안되며이 코드가있는 것입니다. 너무 깊이 중첩 된 해시를 갖는 것은 리팩토링은 이제 2.3의 루비 달성 할 수

+0

해시는 깊이 중첩 된 JSON을 반환하는 웹 서비스에서 온 것입니다. 서비스가 종종 중첩 된 요소를 없애기 때문에 나는 길을 따라 nils를 확인해야합니다. –

+0

이 경우에는 해시를 향상시키기 위해 보석을 사용하여 코드를 읽기 쉽게 만들 것을 권장합니다 (https://github.com/intridea/hashie). – Leito

+0

특히, Mash (https://github.com/intridea/hashie#mash)는 다중 레벨 테스트의 예제를 참조합니다. ifs보다 빠르지는 않지만 코드가 향상됩니다! – Leito

-1

커널 :: 인상도

if obj['key']['key2']['name'] 
    name = obj['key']['key2']['name'] 
else 
    raise '' 
end 
+0

코드가 OP와 다릅니다. 가서'irb '에 시도해보고 왜 그걸 보아라. –

+0

감사합니다 개빈, 나는 OP가 교체되었고 오류가 발생하지 않는 것을 봅니다. 나는 이것에 대해 더 조사 할 것이다. – aug2uag

4

에이 구체적인 예를보고 할 가치가있을 수 nede 것을 좋은 냄새 수 있습니다 dig method.

name = obj.dig 'key', 'key2', 'name' 

이 안전하게 어떤 단계가 실패 할 경우 무기 호를 반환 obj['key']['key2']['name']에 액세스합니다.

은 (는 구문이 복잡하게 경우이 같은 예에서 이해할 수 있지만 일반적으로, 보통, 유일한, 예기치 못한 오류에 대한 예외를 사용하는 것이 좋습니다입니다.) 특정 사용을 위해