【问题标题】:Groovy AntBuilder scp catch exceptionGroovy AntBuilder scp 捕获异常
【发布时间】:2013-08-07 09:51:02
【问题描述】:

我需要使用 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,它不会在 catch 内传递。

有什么想法吗?

【问题讨论】:

  • log.error( 'error', e.cause ) 显示什么?
  • 你能编辑问题并粘贴完整的例外吗?
  • 我刚刚做了更改
  • 那是IOException,不是吗? println e.exception.class 显示什么?
  • 它显示 java.io.IOException。但是如果我放了 catch(java.io.IOException e) 它就不会捕获它。

标签: ant groovy scp antbuilder


【解决方案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
    }
}

【讨论】:

  • 它有效。我没有想到,因为错误消息并不明显。谢谢。
  • @CC。是的,它看起来像 BuildException (无用)委托给底层异常的堆栈。很高兴我能帮忙:-)
  • 我只有一个问题:为什么我必须放 "e.exception instanceof " 而不是 "e instanceof" ? (因为不推荐使用 e.exception)
  • 是吗?嗯......有机会我会看看,Apache没有公共javadoc让它很痛苦:-(
  • 我问过你是因为我没有找到可以代替的东西:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 2019-04-10
  • 2010-09-28
相关资源
最近更新 更多