当前位置: 首页 > 知识库问答 >
问题:

在shell中编写try-catch-finally

苏宏逸
2023-03-14

是否有像java try catch finally这样的linux bash命令?还是linux shell总是在运行?

try {
   `executeCommandWhichCanFail`
   mv output
} catch {
    mv log
} finally {
    rm tmp
}

共有3个答案

柴坚诚
2023-03-14

我在脚本中成功地使用了以下语法:

# Try, catch, finally
(echo "try this") && (echo "and this") || echo "this is the catch statement!"

# this is the 'finally' statement
echo "finally this"

如果try语句抛出错误或以exit 1结束,那么解释器将继续执行catch语句,然后执行finally语句。

如果两个try语句都成功(和/或以退出结束),解释器将跳过catch语句,然后运行finally语句。

示例1:

goodFunction1(){
  # this function works great
  echo "success1"
}

goodFunction2(){
  # this function works great
  echo "success2"
  exit
}

(goodFunction1) && (goodFunction2) || echo "Oops, that didn't work!"

echo "Now this happens!"

输出\u 1

success1
success2
Now this happens!

示例\u 2

functionThrowsErr(){
  # this function returns an error
  ech "halp meh"
}

goodFunction2(){
  # this function works great
  echo "success2"
  exit
}

(functionThrowsErr) && (goodFunction2) || echo "Oops, that didn't work!"

echo "Now this happens!"

输出\u 2

main.sh: line 3: ech: command not found
Oops, that didn't work!
Now this happens!

Example_3

functionThrowsErr(){
  # this function returns an error
  echo "halp meh"
  exit 1
}

goodFunction2(){
  # this function works great
  echo "success2"
}

(functionThrowsErr) && (goodFunction2) || echo "Oops, that didn't work!"

echo "Now this happens!"

Output_3

halp meh
Oops, that didn't work!
Now this happens!

请注意,函数的顺序将影响输出。如果您需要两个语句分别尝试和捕获,请使用两个try catch语句。

(functionThrowsErr) || echo "Oops, functionThrowsErr didn't work!"
(goodFunction2) || echo "Oops, good function is bad"

echo "Now this happens!"

输出

halp meh
Oops, functionThrowsErr didn't work!
success2
Now this happens!
井镜
2023-03-14

嗯,有点:

{ # your 'try' block
    executeCommandWhichCanFail &&
    mv output
} || { # your 'catch' block
    mv log
}

 rm tmp # finally: this will always happen
师赤岩
2023-03-14

根据您的示例,看起来您正在尝试执行类似于总是删除临时文件的操作,而不管脚本如何退出。在Bash中,尝试使用内置命令捕获退出信号。

#!/bin/bash

trap 'rm tmp' EXIT

if executeCommandWhichCanFail; then
    mv output
else
    mv log
    exit 1 #Exit with failure
fi

exit 0 #Exit with success

脚本退出时,始终执行陷阱中的rm tmp语句,因此将始终尝试删除文件“tmp”。

安装的陷阱也可以重置;仅使用信号名称调用陷阱将重置信号处理程序。

trap EXIT

有关更多详细信息,请参阅bash手册页面:ManBash

 类似资料:
  • 问题内容: 我知道这样做的对策。我想知道是否有一种不错且紧凑的方法来做到这一点。 问题答案: 图例-您的答案可能会有所改善;因为如果失败次数过多,就会吞下异常。好多了:

  • 问题内容: 在PHP 5中使用try-catch语句时,要考虑什么样的性能影响? 以前,我已经在网上阅读了一些有关该主题的古老的,看似矛盾的信息。我目前必须使用的许多框架都是在php 4上创建的,并且缺少php 5的许多优点。因此,我在使用try-catchs与php方面经验不足。 问题答案: 要考虑的一件事是,没有引发异常的try块的开销与实际引发和捕获异常的开销是一个不同的问题。 如果仅在失败

  • 问题内容: 我最初从大学开始编程,然后学习了vb.net。现在,我决定转向Java并进行一些查询。在vb中,try catch语句的布局如下 但是在Java网站(https://docs.oracle.com/javase/tutorial/essential/exceptions/putItTogether.html)中,我发现在Java中,您使用了两个陷阱,如下所示: 我希望有人能够解释为什么

  • 问题内容: 我正在审查一些新代码。该程序仅具有try和finally块。由于不包含catch块,如果try块遇到异常或任何可抛出的异常,它将如何工作?它是否直接进入了finally块? 问题答案: 如果try块中的任何代码都可以引发已检查的异常,则它必须出现在方法签名的throws子句中。如果引发了未经检查的异常,则该异常会冒泡退出方法。 无论是否引发异常,都始终执行finally块。

  • 问题内容: 可以在Swift中捕获异常吗?给出以下代码: 是否可以防止异常导致整个程序崩溃?也就是说,Objective-C中的Swift等效于什么: 问题答案: 它没有异常处理,并且在开发人员论坛中的讨论讨论了为什么会这样: 但请记住,可可和可可触控传统上并不打算让您捕获异常。他们打算让您不要将它们放在首位。普通错误应使用可选类型和inout NSError参数处理;您应该通过编写更好的代码来解

  • 我实现了一个try-catch块。 我试图用一种特定的方式实现捕捉块,但是它不太好用。如果输入不是整数,它应该重复并返回到try块。它只工作一次,但更多。 你能给我一些帮助吗?非常感谢。