我正在寻找shell脚本中的异常处理机制。有没有尝试,在shell脚本中捕获等效机制?
答案 0 :(得分:104)
bash中确实没有try/catch
(我假设您正在使用bash),但使用&&
或||
可以实现非常相似的行为。
在此示例中,如果fallback_command
失败(返回非零值),则需要运行a_command
:
a_command || fallback_command
在此示例中,如果second_command
成功(返回0),则需要执行a_command
:
a_command && second_command
使用子shell可以轻松地将它们混合在一起,例如,以下命令将执行a_command
,如果成功,它将运行other_command
,但如果a_command
或{ {1}}失败,other_command
将被执行:
fallback_command
答案 1 :(得分:11)
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
答案 2 :(得分:4)
WITH sample_data ( "COMMENT" ) AS (
SELECT '||1|21|-1|-1|-1|0||||' FROM DUAL
)
SELECT REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 1, NULL, 1 ) AS col1,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 2, NULL, 1 ) AS col2,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 3, NULL, 1 ) AS col3,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 4, NULL, 1 ) AS col4,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 5, NULL, 1 ) AS col5,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 6, NULL, 1 ) AS col6,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 7, NULL, 1 ) AS col7,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 8, NULL, 1 ) AS col8,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 9, NULL, 1 ) AS col9,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 10, NULL, 1 ) AS col10,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 11, NULL, 1 ) AS col11,
REGEXP_SUBSTR( "COMMENT", '(.*?)(\||$)', 1, 12, NULL, 1 ) AS col12
FROM sample_data;
答案 3 :(得分: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-blocks的异常处理类似于 eventhandling , > 可以使用array-support几乎任何语言。
如果你想让你的代码保持整洁(没有if / else冗长),我建议使用事件。
MatToufoutu推荐的建议(使用||和&&)不建议用于功能,但确定简单命令。 (关于风险,见BashPitfalls)
答案 4 :(得分:0)
如果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."