2012-07-25 2 views
3

Ruby에서 특정 코드 라이브러리를 사용할 때 구출해야 할 예외가 무엇인지 알지 못해 종종 혼자 있습니다.구출 할 예외를 아는 방법은 무엇입니까?

예를 들어, 필자는 필자의 레일/sinatra 응용 프로그램이 만들 HTTP 요청에 HTTParty를 자주 사용합니다. HTTParty 코드 주위를 파고 정의 된 예외가 포함 된 파일을 찾았습니다. 큰! 나는 요청할 때 그들을 구출 할 것이다.

테스트를 위해 요청에 대한 허위 도메인 이름을 넣었지만 예상 한 HTTParty :: ResponseError 예외 대신 SocketError 예외가 발생했습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 나는 HTTParty가 Ruby의 구현을 감싸는 래퍼이며 SocketError 예외를 던진 것임을 알고있다. 하지만 내가 어떻게 그걸 정상적으로 알 수 있겠 니?

"Exception"을 구제하여이 문제를 해결할 수는 있지만 꽤 힘든 일입니다. 나는 오히려 내가 그것들을 일으킬 수 있고 다루는 예외에 대해 잘 알고있을 것이다.

편집 : 실제로이 질문을 작성하게 된 것은 특정 기능을 호출 할 때 발생할 수있는 가능한 예외를 어떻게 파악할 수 있는지 알 수 없다는 것입니다. 스택의 모든 단일 함수 호출을 살펴 봅니다.

+1

* 왜 * 예외를 구조 하시겠습니까? 프로그램에서 문제를 일으키는 경우 계속 처리하는 것이 무엇을 계획하고 있습니까? –

답변

0

위조 된 도메인 이름을 넣으면 socketError 응답이 문제가되지 않습니다. 결국 존재하지 않는 도메인에 연결하려고하면 연결에 AKA SocketError가 실패합니다.

가장 좋은 방법은 테스트에서 잘못된 URL을 사용하는 유효한 도메인을 사용하지만 실제 코드에서 socketError를 잡는 것입니다.

여기서의 문제는 잘못된 예외를 잡는 것이 아니라 잘못된 데이터로 테스트를 시작한다는 것입니다.

가장 좋은 방법은 예외가 발생하고이를 관리 할 수있는 방법을 이해하는 것입니다. 내가 이해한다고 말하면 이해할 수 있습니다. URL은 어디에서 왔으며 사용자가 입력 했습니까? 그렇다면 결코을 신뢰하고 모든 것을 잡으십시오. 그것은 당신의 설정 데이터에서 오는가? URL을 확인하는 것이 중요하지 않은 한 세미 로그를 남기고 오류를 기록하십시오.

여기에 맞거나 틀린 대답은 없지만이 접근법은 좋은 결과를 줄 것입니다.

편집 : 여기에서 내가 시도하는 것은 프로그래머가 자신의 행동 결과를 알고있는 사고 방식을 옹호하는 것입니다. 우리는 'thisServiceIsTotallyBogus.somethingbad.notAvalidDomain'에 연결하려는 시도가 실패한다는 것을 알고 있습니다. 하지만 프로그래머의 사고 방식은 먼저 해당 도메인의 출처를 정확히 확인하는 것입니다. 사용자가 입력 한 경우에는 전체 검사를 수행해야합니다. 당신 자신이나 지원 팀이 접근 한 설정 파일에서 온 것임을 안다면; 당신은 조금 긴장을 풀 수 있습니다; 슬프게도 인터넷이 작동하지 않기 때문에 항상 URL을 테스트해야하므로 나쁜 예입니다!

사용하는 모든 것에 대한 개발자 문서는 이상이 발생할 수있는 예외를 알려주는 것이 이상적입니다.

+0

이 경우 요청이 내 제어하에 있습니다. 서버가 다운 된 경우 어떤 일이 일어날 지 시뮬레이션하고 싶었습니다. 그 서버를 실제로 가져 오면 소켓 오류가 발생합니다. 요청을 수신하고 응답 할 도메인이 없기 때문입니다. – Brian

6

일반적으로 (저는 루비 프로그래머가 아닙니다.) 다음 접근 방식을 사용합니다.

나는 다음과 같은 방법으로 예외를 처리

을 : 나는 그것에서 복구 할 수

  • ? 예외가 발생할 수 있고 복구하거나 재 시도 할 수있는 경우 예외를 처리합니다.

  • 신고해야합니까? 예외가 발생할 수 있지만 복구 할 수 없거나 다시 시도 할 수 없다는 것을 알고 있으면 로깅하고 호출자에게 전달하여 예외를 처리합니다. 저는 항상 주요 모듈이나 서비스처럼 자연스러운 서브 시스템 경계에서이 작업을 수행합니다. 때로는 (API에 종속적 인) 호출자 만 예외를 처리 할 수 ​​있도록 예외를 '내 모듈'특정 코드로 래핑 할 수 있습니다.

  • 처리 할 수 ​​없습니까? 처리되지 않은 모든 예외 사항은 최상위 레벨에서 포착되어야하며 (a)보고되고, (b) 시스템이 안정되고 일관성을 유지하는지 확인해야합니다. 이것은 다른 두 가지가 수행되었는지 여부에 관계없이 항상 거기에 있어야하는 것입니다.

당연히 다른 종류의 예외가 있습니다. 이것들을 위해서 오직 하나의 해결책이 있습니다 - 포스트 모템 (Fortune Mortem) 디버깅입니다. 가장 좋은 것은 로그, 로그 그리고 더 많은 로그입니다. 그리고 소규모에서 대규모로 많은 시스템에서 작업 해 왔기 때문에, 안정성과 복구 가능성을 위해 성능을 희생하는 것이 중요합니다 (중요한 경우 제외). 가능한 경우 내재적으로 로깅을 추가하십시오.

+0

네 번째 사례에 관해서; 당신이 그것을 다룰 수 없다면 예외는 아닐 것입니다. 내가 의미하는 바를 안다면 구조 대원을 구하려고 아무런 소용이 없습니다. 내 정신은 예외가 예외적이어야하며 프로그램 흐름의 인공물이 아니라는 것입니다. IE : 예외가 예상됩니다. –

+0

이것은 좋은 접근 방법입니다. 감사합니다. – Brian

+0

@RussC : 나는 당신을 이해하는지 모르겠습니다. 제 4 번째 포인트는 당신이 붙잡을 수없는 것들입니다. 그러나 그러한 시나리오에서는 상태를 복구 (보상)해야 할 수도 있습니다. 따라서 내 로깅 의견. –

관련 문제