2013-08-06 4 views
1

Мне нужно скопировать некоторые файлы с помощью scp с удаленного хоста.Groovy AntBuilder scp catch exception

Если файла нет, мне нужно отобразить сообщение.

Проблема, которую я имею, заключается в том, что я не могу поймать исключение FileNotFound. Все, что у меня есть, это BuildException, но это повышается, даже если связь не может быть выполнена, например.

Вот мой код

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

Когда я поставил

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

я следующее:

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) 

Когда я кладу println e.class отображает BuildException. Проблема в том, что если я пытаюсь поймать IOException, она не пройдет внутри catch.

Любые идеи?

+0

, что делает 'log.error ('ошибка', e.cause)' шоу? –

+0

То же сообщение –

+0

Можете ли вы отредактировать вопрос и вставить полное исключение? –

ответ

2

Таким образом, похоже, что Ant использует BuildException, чтобы обернуть все исключения, которые выбрасываются.

Чтобы показать сообщение, вам нужно сделать что-то вроде:

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.exception instanceof» вместо «e instanceof»? (потому что e.exception устарел) –

Смежные вопросы