각 디렉터리에서 가장 최근에 수정 된 파일을 찾는 파일과 디렉터리를 처리하고 있습니다. 코드는 작동하지만 Ruby에 익숙하지 않아 오류를 올바르게 처리하는 데 문제가 있습니다.Find.find에서 예외를 처리하는 방법
나는 각 디렉토리에 대한 내 자신의 기능 newestFile
를 호출, 재귀 적 디렉토리 목록을 얻을 수 Find.find
를 사용 : 나는 액세스 권한이없는 폴더가
Find.find(ARGV[0]) { |f|
if File.directory?(f)
newestFile(f)
end
}
디렉토리 트리에서, 그래서 무시해야합니다 그들과 다음에 가서,하지만 난 "루프"Find.find
에 예외 처리를 통합하는 방법을 볼 수 없습니다.
블록 주위에 begin..rescue..end
을 넣으려고했으나 루프 처리를 계속할 수 없습니다.
나는 또한이 질문을 발견 : How to continue processing a block in Ruby after an exception?하지만 에서 루프를 처리합니다. 예외 블록 외부에있는 Find.find
에 발생한 오류를 복구하려고합니다.
PS D:\dev\ruby\> ruby .\findrecent.rb "M:/main/*"
C:/Ruby200/lib/ruby/2.0.0/find.rb:51:in `open': Invalid argument - M:/main/<A FOLDER I CAN'T ACCESS> (Errno::EINVAL)
from C:/Ruby200/lib/ruby/2.0.0/find.rb:51:in `entries'
from C:/Ruby200/lib/ruby/2.0.0/find.rb:51:in `block in find'
from C:/Ruby200/lib/ruby/2.0.0/find.rb:42:in `catch'
from C:/Ruby200/lib/ruby/2.0.0/find.rb:42:in `find'
from ./findrecent.rb:17:in `<main>'
가 어떻게이 코드에 예외 처리를 추가하려면 :
다음은 오류의 스택 추적입니까?
나는 예외가 생성되는 코드의 모양을했다 및 방법은 다음 블록이 포함되어if s.directory? then
begin
fs = Dir.entries(file)
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
next
end
... more code
내가 rescue
오류 목록에 Errno::EINVAL
을 추가 된 끔찍한 해킹을 수행합니다. 이제 내 코드가 실행되고 모든 폴더를 통과하지만 Ruby 라이브러리 코드에 그 변경 사항을 남겨 둘 수는 없습니다.
내부적으로 find
은 Dir.entries
을 사용하고 있으므로 폴더를 직접 처리하기 위해 코드를 다시 작성해야하며 find
에 의존하지 않아도됩니다.
다른 종류의 코드를 읽는 것과 같은 종류의 코드 구조에서 오류를 처리하는 방법이 있는지 알고 싶습니다.이 유형의 작고 간결한 코드는 Ruby에서 많이 사용됩니다.
스택 추적으로 내 질문을 업데이트했습니다. 불행히도 오류는'Find.find' 코드에서 유래합니다. – Tony
제안 해 주셔서 감사합니다. 당신의 코멘트 "그것은 그 방법 안에서 일어날 것입니다." 나는 더 깊이 조사 할 생각을하게 만들었고, 그래서 나는'find' 코드를보고 내 질문에 더 많이 추가했습니다. – Tony
루비의'찾기 '는 OP가 그것을 사용하고있는 목적을 위해 특별히 작성된 것으로, 디렉토리 계층을 빠르게 탐색하고 기준에 따라 파일이나 디렉토리를 선택적으로 처리합니다. 'Dir.entries'는 좀 더 일반적이고 * 비슷한 방법으로 사용할 수 있지만 더 많은 코드가 생성됩니다. –