记录学习与后端知识并分享学习代码过程(会飞的鱼Blog)

异常处理最佳实践总结与错误代码

会飞的鱼 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

记住:优秀的代码是一种艺术,更是一种责任。写代码时多想想维护者的感受,因为那个人很可能就是半年后的你自己!


本文为技术分享,希望对您有所帮助。如有问题欢迎在评论区交流讨论。

本文由 @会飞的鱼 于 2026-6-12 发布在 会飞的鱼Blog,如无特别说明,本博文章均为原创,转载请保留出处。

网友评论

    暂无评论

会飞的鱼 在线咨询

在线时间:9:00-22:00
周六、周日:14:00-22:00