2011-07-01 6 views
0

POST 개의 CSV 파일을 처리하고 잘못된 입력 (예 : 비 CSV 파일)에 대해 테스트하는 간단한 앱을 작성 중입니다. 그러나구조가 Rails에서 구조되지 않습니다

@parsed_file = CSV::Reader.parse(params[:file]) rescue [] 

부적절한 제출이있을 때 구조 문에도 불구하고, 나는 아직도 잡히지 않은 CSV::IllegalFormatError 받고 있어요, 다음과 같이 나는 컨트롤러 방법에 CSV를 구문 분석하는 CSV :: Reader.parse 명령을 사용하고 있습니다 입력되었습니다. 내가 여기서 무엇을 놓치고 있니?

감사합니다.

+0

괄호 안에 진술을 래핑 해 보았습니까? @parsed_file = (CSV :: Reader.parse (params [: file]) rescue [])'와 같이 사용합니다. 루비의 어떤 버전을 사용하고 있습니까? – diedthreetimes

+0

그래, 그건 나에게도 도움이 안된다. 나는 1.8.7을 사용하고있다. 이것에 대해 아무것도 나에게 어떤 의미가 있습니다 ... – justinbach

+0

이 작동합니까? '@parsed_file = raise CSV :: IllegalFormatError rescue nil' 만약 당신이 테스트 환경 밖에서 실행한다면 (즉, 웹 서버를 통해) – diedthreetimes

답변

0

나는에 가지고 결국 제대로 예외를 처리하기 위해 CSV :: 리더 클래스를 원숭이 패치. 이 컨트롤러에 붙 잡히기되지 않은 이유를 나는 아직도 잘 모르겠지만, 여기에 코드를 내가 쓰기 결국입니다 :

class CSV 
    class Reader 
    def each 
     while true 
     row = [] 
     parsed_cells = get_row(row) rescue 0 
     if parsed_cells == 0 
      break 
     end 
     yield(row) 
     end 
     nil 
    end 
    end 
end 

참고 원본에 존재하지 get_row 호출, 후 rescue 0을 . 확실히 못생긴 해킹이지만 내 목적을 달성 할 수 있습니다.

예외가 컨트롤러에서 발견되지 않은 이유를 누구나 설명 할 수 있다면 정답을 기재 한 점을 기꺼이 알려 드리겠습니다.

0

당신은 구문 분석 할 파일 핸들을 전달해야합니다

@parsed_file = CSV::Reader.parse(File.open(params[:file], 'rb')) rescue [] 
+0

응답 해 주셔서 감사합니다. 귀하의 수정 사항에 더 이상 오류가 없지만, 올바르게 작동하고 있던 CSV 파싱 기능이 손상된 것으로 보입니다. 파일 유효성에 관계없이 @parsed_file이 비어있는 것 같습니다. – justinbach

+0

죄송합니다. 오타가 있습니다. 지금은 어때? – glortho

+0

아니요, 불행히도 같은 ...그것은 제출 된 파일이 유효한 CSV인지 여부와 동일하게 동작합니다. 즉, 예외가 항상 throw되며 @parsed_file은 항상 []로 할당됩니다. – justinbach

0

마치 CSV::IllegalFormatError이 서브 클래스 RuntimeError이 아닌 것처럼 들립니다. 또는 RuntimeError이 서브 클래스가 아닌 StandardError으로 변경되었습니다.

서브 클래스 StandardError의 오류는 기본 구조 블록에서 캐치됩니다. 이 이론은 내가 (그리고 아마도 다른 사람)이 문제를 반복 할 수 없습니다 이유는 설명 할

@parsed_file = begin 
    CSV::Reader.parse(params[:file]) 
rescue StandardError 
    puts "I caught a StandardError" 
    [] 
rescue Exception => e 
    puts "I caught #{e.class}->#{e.class.superclass}->#{e.class.superclass.superclass}" 
    [] 
end 

시도 테스트합니다.

명시 적으로 Exception을 사용하는 어떤 경우에도 작동해야하며 원숭이 패치보다 깨끗합니다.

+0

당신의 설명은 나에게 많은 의미가있다. 높은 희망이 있었지만 코드 스 니펫을 시도 할 때 비 -CSV 제출을 사용할 때 여전히 'IllegalFormatError'가 잡히지 않았습니다. 무슨 일이 벌어 질지에 대한 다른 생각은 없습니까? – justinbach

관련 문제