2013-08-06 4 views
1

원격 호스트에서 scp를 사용하여 일부 파일을 복사해야합니다.Groovy AntBuilder scp catch 예외

파일이 없으면 메시지를 표시해야합니다.

내가 가진 문제는 예외를 FileNotFound 잡을 수 없다는 것입니다. 내가 가진 것은 모두 BuildException이지만 연결이 완료되지 않은 경우에도 발생합니다.

java.io.IOException: scp: theFileToLook: No such file or directory 
    at org.apache.tools.ant.taskdefs.optional.ssh.ScpFromMessage.startRemoteCpProtocol(ScpFromMessage.java:189) 
    at org.apache.tools.ant.taskdefs.optional.ssh.ScpFromMessage.execute(ScpFromMessage.java:143) 
    at org.apache.tools.ant.taskdefs.optional.ssh.Scp.download(Scp.java:276) 
    at org.apache.tools.ant.taskdefs.optional.ssh.Scp.execute(Scp.java:221) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at MyService$$EODjgsH6.executeScp(MyService.groovy:98) 
    at MyService$$EODjgsH6.getFileFromRemoteHost(MyService.groovy:63) 
    at MyController.get(RetrieveController.groovy:36) 
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195) 
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:724) 

나는 그것이 BuildException 표시 println e.class을 넣어 :

여기에 내가 다음 한

catch(Exception e){ 
    log.error("error", e) 
} 

을 넣어 내 코드

def ant = new AntBuilder() 
ant.scp(
    trust:true, 
    file:"theFileToLook", 
    todir:"destinationFolder", 
    keyfile: "myrivateKeyFile", 
    verbose:true 
) 

입니다. IOException을 잡으려고 할 때 캐치 내부를 통과하지 못하는 문제가 있습니다.

아이디어가 있으십니까?

+0

:

메시지를 표시하려면, 당신은 뭔가를 구현해야하는 것? –

+0

같은 메시지 –

+0

질문을 편집하고 전체 예외를 붙여 넣을 수 있습니까? –

답변

2

따라서 Ant는 던져진 예외를 랩핑하기 위해 BuildException을 사용합니다. `log.error ('오류', e.cause)`쇼를 무엇

def ant = new AntBuilder() 
try { 
    ant.scp(
     trust:true, 
     file:"theFileToLook", 
     todir:"destinationFolder", 
     keyfile: "myrivateKeyFile", 
     verbose:true 
    ) 
} 
catch(BuildException ex) { 
    if(ex.exception instanceof IOException) { 
     println "Whoops! $ex.exception.message" 
    } 
    else { 
     throw ex 
    } 
} 
+0

그것은 작동합니다. 나는 명백하지 않은 오류 메시지 때문에 그것을 생각하지 않았습니다. 감사. –

+0

@CC. 예, 근본적인 예외 스택에 BuildException (비협조적) 대리자와 같이 보입니다. 다행히 도울 수있다 :-) –

+0

"e instanceof"대신 "e.exception instanceof"를 넣어야하는 이유는 무엇인가? (e.exception은 사용되지 않기 때문에) –