设计思路
- 函数定义与嵌套:定义多个嵌套的函数,每个函数执行特定的任务,如文件操作或命令执行。
- 错误捕获:在每个函数内部,使用
set -e
或手动检查命令的返回值来捕获错误。如果发生错误,通过return
语句将错误代码传递给调用者。
- 错误传播:外层函数捕获内层函数返回的错误代码,并根据需要进行处理。这样可以实现错误从内层到外层的准确传递。
- 资源管理:在函数内部,确保所有资源(如文件描述符)在函数结束时正确关闭,以避免资源泄漏。可以使用
trap
命令在函数退出时执行清理操作。
核心代码片段
#!/bin/bash
# 最内层函数:尝试打开文件
open_file() {
local file="$1"
# 打开文件描述符3
exec 3<> "$file"
if [ $? -ne 0 ]; then
echo "无法打开文件: $file"
return 1
fi
# 设置退出时关闭文件描述符3
trap 'exec 3>&-' EXIT
# 模拟文件操作
echo "文件 $file 已打开,执行操作..."
return 0
}
# 中间层函数:调用open_file并执行命令
execute_command() {
local file="$1"
open_file "$file"
if [ $? -ne 0 ]; then
return 1
fi
# 模拟命令执行
command_output=$(ls /nonexistent_directory 2>&1)
if [ $? -ne 0 ]; then
echo "命令执行错误: $command_output"
return 1
fi
return 0
}
# 最外层函数:调用execute_command并处理错误
main() {
local file="$1"
execute_command "$file"
local result=$?
if [ $result -ne 0 ]; then
echo "发生错误,错误代码: $result"
# 可以在这里进行更多的错误处理,如记录日志等
else
echo "所有操作成功完成"
fi
return $result
}
# 调用最外层函数
main "test.txt"
错误传播和恢复机制说明
- 错误传播:
- 最内层函数
open_file
如果无法打开文件,会返回错误代码1。
- 中间层函数
execute_command
调用open_file
,并检查其返回值。如果open_file
返回错误,execute_command
也返回错误代码1。
- 最外层函数
main
调用execute_command
,并捕获其返回值。根据返回值判断是否发生错误,并进行相应处理。
- 恢复机制:
- 在
open_file
函数中,使用exec
打开文件描述符,并通过trap
命令在函数退出时关闭文件描述符,确保文件操作完成后资源被正确释放,避免资源泄漏。
- 对于命令执行错误,如
ls /nonexistent_directory
,函数返回错误代码,并输出错误信息,外层函数可以根据这些信息进行处理。