2010-04-17 5 views
4

내 코드에 도처에 begin ... rescue ... end 문장이있는 것 같습니다! 이것은 올바른 일처럼 보이지 않습니다.Ruby에서 구조 대처 방법?

누구나 안에 모든 것을 넣지 않고도 예외를 잡을 수있는 방법을 제안 할 수 있습니까? begin ... rescue ... end? 루비에게 닥치라고 말하고 예외가 발생하더라도 계속 진행할 수있는 방법은 없나요? 아니,

def get_file_prompt 
    print "Enter file name: " 
    return File.open(read) 
rescue StandardError 
    puts "File could not be opened" 
    return nil 
end 
+0

예외가 발생하는 경우 일반적으로 Ruby *가 자동으로 계속 진행할 수없는 문제가 있기 때문입니다. 그것이 구조대를 가지고있는 요점입니다. – Gareth

+0

질문에 맞는 코드를 만들 수 있다면 코드 스 니펫을 사용하면 예외적으로 예외가 필요한지 여부를 판단 할 수 있습니다. –

답변

10

다른 언어와 마찬가지로 중요한 프로그램의 경우 실제로 예외 처리를 위해 잘 고려 된 아키텍처가 필요합니다. 한 가지 방법은 프로젝트 내에서 예외 처리 범위를 정의한 다음 일반적으로 범위 경계에서 예외를 잡아 내고 싶습니다. 절충안이 있습니다. 예외가 발생한 곳까지 스택에 가까울수록 트리거 한 조건에 대한 상황 별 정보가 많아집니다. 너가 너무 세분화하려고하면, 너는 너가 기술 한 문제로 달린다. 반면에 스택의 맨 위에있는 예외 ("main") 만 잡으면 아무런 문맥도 없습니다. 그래서 예외 처리 범위를 정의하는 것은 특정 프로그램이나 시스템과 관련하여 그 거래를 평가하는 것을 포함합니다.

루비는 "재시도"기능을 제공합니다. 다른 언어에서는 사용할 수 없습니다. 이것은 가급적 사용해야합니다! 그러나 (예를 들어, 네트워크 또는 리소스가 해제 될 때까지 기다리는 것과 같은) 의미가있는 경우, 그러한 예외는 매우 국부적으로 처리 될 필요가있다.

그렇지 않으면 대형 프로젝트에서 상당히 조잡한 수준에서 예외 범위를 정의하는 경향이 있습니다. 예외가 출현 지점에서부터 다양한 예외 범위 경계까지 버려지기 때문에 상황 정보를 캡처하는 것이 종종 유용합니다. 이를 돕기 위해, 애플리케이션 고유의 예외 유형 중 일부를 정의하여 Ruby 예외 클래스 계층 구조를 확장 할 수 있지만 또 다시 절충점이 있습니다. 프로젝트에는 사용자 정의 예외 유형을 사용할 때와 메시지 필드에서 상황에 맞는 데이터를 캡처하는 경우, 메시지 필드에 어떤 종류의 정보를 포함시켜야하는지 등에 대한 명확한 표준과 코드에서 생성 할 수있는 메시지를 카탈로그 화하는 전략이 있어야합니다.

대부분의 경우 예외는 중앙 집중식 처리기로 전파되고, 기록되고 (기술 팀 및 지원을 위해), 사용자에게 유용한 오류 메시지를 생성하고, 조건이 충분히 심각한지 여부를 결정하도록 허용 될 수 있습니다 프로그램을 종료해야합니다. 일반적으로 모든 예외는 코드 또는 사용중인 응용 프로그램 프레임 워크에서 처리해야합니다. 예외는 언어 런타임이나 OS의 기본 예외 처리에서 벗어나지 않아야합니다.

이들은 다른 언어의 경험을 바탕으로 한 나의 생각이지만, 일반적으로는 꽤 많이 적용된다고 생각합니다. 결론적으로, 대형 프로젝트에서는 예외 처리를 설계하는 데 많은 노력을 기울일 필요가 있습니다.

4

한 가지. 예외의 전체적인 요점은 그들이 처리되어야하는 조건이라는 것입니다.

이런 식으로 생각하십시오 : 예외는 친구입니다! 그들 없이는 읽기 및 유지가 어려울 지루한 조건문을 많이 작성해야합니다.

Ruby (또는 예외 시스템이있는 언어)를 학습하는 경우 예외를 다루는 것이 가장 중요한 측면 중 하나이며,이를 처리하는 방법을 알아내는 데 시간을 할애해야합니다. - 그들을 격려하고, 그들을 무시하는 것이 안전 할 때.

1

음 : 그것은 당신이 시작 필요 들여 쓰기의 또 다른 수준하지 않도록 조금 청소기 방법의 끝에있는 구조를 가하고 볼 수 있습니다

6
def action 
    yield 
    rescue 
     .... 
    ensure 
     .... 
end 

action { stuff_goes_here } 
관련 문제