Groovy AntBuilder scp catch исключение

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

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

Проблема в том, что я не могу поймать 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, он не проходит внутри перехвата.

Есть идеи?

1 ответ

Решение

Похоже, что 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
    }
}
Другие вопросы по тегам