异常处理最佳实践总结与错误代码
0
5
2026年6月12日
优秀的代码不仅能运行,还要可读、可维护、可扩展。遵循单一职责原则,一个函数只做一件事。合理命名,变量名和函数名要见名知意。本文将通过代码示例,分享编程的最佳实践。
一、代码命名规范
写注释,但不要写废话,注释应该解释"为什么"而不是"是什么"。函数参数不要超过3个,过多时考虑使用对象传递。
良好的命名示例:
// ❌ 不好的命名
const d = 7; // 什么意思?
const fn = () => {}; // 做什么的?
const data = []; // 什么数据?
// ✅ 好的命名
const DAYS_IN_WEEK = 7; // 常量大写,语义清晰
const calculateTotal = () => {}; // 动词开头,说明做什么
const userList = []; // 明确数据类型和内容
// ✅ 布尔值用is/has/can开头
const isActive = true;
const hasPermission = false;
const canEdit = true;
二、函数设计原则
单一职责函数示例:
# ❌ 一个函数做太多事
def process_user_data(data):
# 验证
if not data.get('email'):
raise ValueError('邮箱必填')
# 格式化
data['email'] = data['email'].lower().strip()
# 保存
db.insert(data)
# 发邮件
send_welcome_email(data['email'])
# 记录日志
logger.info(f"用户创建成功: {data['id']}")
# ✅ 拆分,每个函数只做一件事
def validate_user_data(data):
if not data.get('email'):
raise ValueError('邮箱必填')
return True
def format_user_data(data):
return {**data, 'email': data['email'].lower().strip()}
def create_user(data):
validate_user_data(data)
formatted_data = format_user_data(data)
user_id = db.insert(formatted_data)
send_welcome_email(formatted_data['email'])
logger.info(f"用户创建成功: {user_id}")
return user_id
三、错误处理最佳实践
错误处理要完善,不要吞掉异常。使用统一的错误码和错误信息。日志记录要完整,包含时间、级别、上下文信息。
优雅的错误处理:
// 自定义错误类
class AppError extends Error {
constructor(message, code = 500) {
super(message);
this.code = code;
this.name = 'AppError';
}
}
// 统一错误处理中间件
function errorHandler(err, req, res, next) {
console.error('[ERROR]', {
message: err.message,
stack: err.stack,
url: req.url,
method: req.method
});
const statusCode = err.code || 500;
res.status(statusCode).json({
success: false,
message: err.message || '服务器内部错误',
code: statusCode
});
}
// 使用示例
async function getUser(req, res) {
const user = await User.findById(req.params.id);
if (!user) {
throw new AppError('用户不存在', 404);
}
res.json({ success: true, data: user });
}
四、代码是写给人看的
代码是写给人看的,顺便给机器执行。今天写的代码,半年后你自己还要能看懂。团队协作遵循统一的编码规范,代码审查不可或缺。
日志记录最佳实践:
import logging
from datetime import datetime
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('app.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# 使用日志
def process_order(order_id):
logger.info(f"开始处理订单: {order_id}")
try:
order = get_order(order_id)
logger.debug(f"订单详情: {order}")
# 处理逻辑
logger.info(f"订单处理成功: {order_id}")
except Exception as e:
logger.error(f"订单处理失败: {order_id}, 错误: {str(e)}", exc_info=True)
raise
记住:优秀的代码是一种艺术,更是一种责任。写代码时多想想维护者的感受,因为那个人很可能就是半年后的你自己!
本文为技术分享,希望对您有所帮助。如有问题欢迎在评论区交流讨论。
在线咨询
上一个应该是我,我买了一年,实在没价值,...