【问题标题】:Exception handling in shell scripting?shell脚本中的异常处理?
【发布时间】:2011-10-21 03:24:52
【问题描述】:

我正在寻找 shell 脚本中的异常处理机制。 shell脚本中是否有try,catch等价机制?

【问题讨论】:

标签: bash shell exception-handling


【解决方案1】:
{
    # command which may fail and give an error 
} || {
   # command which should be run instead of the above failing      command
}

【讨论】:

  • 如果您向提出问题的人解释,您发布的伪代码可能是better,而不仅仅是他们可能无法理解的一段神秘代码。如果孩子听不懂,那就不好回答了。
【解决方案2】:

当error_exit 是接受一个参数的函数时,使用以下方法正确处理错误。如果没有传递参数,那么它将在实际发生错误的地方抛出未知错误 LineNo。请在实际用于生产之前进行试验-

#!/bin/bash

PROGNAME=$(basename $0)

error_exit()

{

    echo "${PROGNAME}: ${1:-"Unknown Error"}" 1>&2
    exit 1
}

echo "Example of error with line number and message"
error_exit "$LINENO: An error has occurred."

【讨论】:

    【解决方案3】:

    这里是 bash 中的two simple bashfunctions which enable eventhandling

    您可以将它用于基本的异常处理,如下所示:

    onFoo(){
      echo "onFoo() called width arg $1!"
    }  
    
    foo(){
      [[ -f /tmp/somefile ]] || throw EXCEPTION_FOO_OCCURED "some arg"
    } 
    
    addListener EXCEPTION_FOO_OCCURED onFoo
    

    bash 不支持使用 try/catch 块进行异常处理,但是,您可能想尝试查看支持它的 BANGSH 框架(它有点像 bash 的 jquery)。

    然而,没有级联 try/catch 块的异常处理类似于 事件处理 可以在几乎任何语言中支持数组。

    如果你想让你的代码保持整洁(没有 if/else 冗长),我建议使用事件。

    MatToufoutu 推荐的建议(使用 || 和 &&)不推荐用于函数,但可以用于简单的命令。 (有关风险,请参阅BashPitfalls

    【讨论】:

      【解决方案4】:

      在 bash 中并没有真正的 try/catch(我假设您正在使用 bash),但您可以使用 &&|| 实现非常相似的行为。

      在本例中,如果a_command 失败(返回非零值),您想运行fallback_command

      a_command || fallback_command
      

      在这个例子中,如果a_command成功(返回0),你想执行second_command

      a_command && second_command
      

      它们可以通过使用子shell轻松混合在一起,例如,以下命令将执行a_command,如果成功则运行other_command,但如果a_commandother_command失败,则@987654334 @ 将被执行:

      (a_command && other_command) || fallback_command
      

      【讨论】:

      • 奖励:如果你想要“终于”这样的行为,请像这样使用无操作(:在 bash 中):(a_command || : ) 并且下一行将运行,就好像在 a_command 中没有发生错误一样.
      • 不是真的,因为 finally 的语义是不管异常状态如何,它都会运行。
      【解决方案5】:

      if/else 结构和退出代码可以帮助您伪造其中的一部分。这应该可以在 Bash 或 Bourne (sh) 中使用。

      if foo ; then
      else
        e=$?        # return code from if
        if [ "${e}" -eq "1"]; then
          echo "Foo returned exit code 1"
        elif [ "${e}" -gt "1"]; then
          echo "Foo returned BAD exit code ${e}"
        fi
      fi
      

      【讨论】:

      • if foo ; then else 可以简化为if ! foo ; then,无论如何+1。
      • @jiliagre 那行不通。 "!foo" 反转 $?从 0 到 1 和 !0 到 0。
      • 可以这部分:if [ "${e}" -eq "1"];然后 echo "Foo 返回退出代码 1" elif [ "${e}" -gt "1"];然后 echo "Foo returned BAD exit code ${e}" 简化为: if [ "${e}" -ge "1" ];然后回显“Foo返回了错误的退出代码${e}”?
      猜你喜欢
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      相关资源
      最近更新 更多