93 lines
2.5 KiB
Bash
93 lines
2.5 KiB
Bash
#!/bin/bash
|
|
|
|
# 标准错误处理模板
|
|
# 所有新脚本和重构脚本应该使用这个模板
|
|
|
|
# ======= 标准错误处理设置 =======
|
|
|
|
# 加载公共库 (必须)
|
|
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
if [[ -f "$SCRIPT_DIR/common.sh" ]]; then
|
|
source "$SCRIPT_DIR/common.sh"
|
|
else
|
|
echo "错误: 无法加载公共库 common.sh" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# 根据脚本类型选择错误处理模式
|
|
|
|
# 模式 1: 标准脚本 (推荐用于大多数脚本)
|
|
# - 使用 common.sh 的错误处理
|
|
# - 支持优雅退出和清理
|
|
init_error_handling() {
|
|
enable_error_handling
|
|
log_info "脚本开始执行: ${BASH_SOURCE[1]##*/}"
|
|
}
|
|
|
|
# 模式 2: 严格脚本 (用于安全关键脚本)
|
|
# - 立即退出任何错误
|
|
# - 适用于: input-validation.sh, secure-download.sh
|
|
init_strict_error_handling() {
|
|
set -euo pipefail
|
|
log_info "脚本开始执行 (严格模式): ${BASH_SOURCE[1]##*/}"
|
|
}
|
|
|
|
# 模式 3: 宽松脚本 (用于交互式脚本)
|
|
# - 允许某些错误继续执行
|
|
# - 适用于: 菜单脚本、用户交互脚本
|
|
init_interactive_error_handling() {
|
|
set -uo pipefail
|
|
# 不使用 -e,允许交互式错误处理
|
|
log_info "脚本开始执行 (交互模式): ${BASH_SOURCE[1]##*/}"
|
|
}
|
|
|
|
# ======= 清理函数模板 =======
|
|
|
|
# 标准清理函数 - 每个脚本都应该实现
|
|
cleanup() {
|
|
local exit_code=${1:-0}
|
|
|
|
# 在这里添加脚本特定的清理逻辑
|
|
# 例如:
|
|
# - 删除临时文件
|
|
# - 关闭网络连接
|
|
# - 恢复系统状态
|
|
|
|
log_debug "清理操作完成 (退出码: $exit_code)"
|
|
}
|
|
|
|
# ======= 使用示例 =======
|
|
|
|
# 在你的脚本中使用:
|
|
#
|
|
# #!/bin/bash
|
|
# source "$(dirname "${BASH_SOURCE[0]}")/error-handling-template.sh"
|
|
#
|
|
# # 选择适合的错误处理模式
|
|
# init_error_handling # 或 init_strict_error_handling 或 init_interactive_error_handling
|
|
#
|
|
# # 实现你的清理函数
|
|
# cleanup() {
|
|
# local exit_code=${1:-0}
|
|
# rm -f /tmp/my_temp_file
|
|
# log_debug "清理完成"
|
|
# }
|
|
#
|
|
# # 你的脚本逻辑
|
|
# main() {
|
|
# log_info "开始主要功能"
|
|
# # ... 你的代码 ...
|
|
# }
|
|
#
|
|
# main "$@"
|
|
|
|
# ======= 最佳实践 =======
|
|
|
|
# 1. 总是使用 init_* 函数之一
|
|
# 2. 总是实现 cleanup 函数
|
|
# 3. 使用 log_* 函数而不是 echo 输出重要信息
|
|
# 4. 对于临时文件,使用 register_temp_file 自动清理
|
|
# 5. 对于交互式输入,验证用户输入
|
|
# 6. 对于网络操作,添加超时和重试机制
|
|
|
|
export -f init_error_handling init_strict_error_handling init_interactive_error_handling |