更优方法:语言异常的显式处理或自动捕获

举报
码乐 发表于 2025/09/12 06:54:59 2025/09/12
【摘要】 1 简介编程免不得要处理各种异常,比如系统的,语言层面的,数据库的,业务逻辑的异常。本文从 语言设计哲学 和 SQL错误处理 两个方面来对比分析。 2、Golang 与 Python 在错误处理上的设计理念Go 的错误处理哲学显式 (Explicit) 优于隐式 (Implicit)Go 选择了非常“啰嗦”的 if err != nil 风格,这是出于语言设计哲学:程序员必须正视每一步可能...

1 简介

编程免不得要处理各种异常,比如系统的,语言层面的,数据库的,业务逻辑的异常。本文从 语言设计哲学 和 SQL错误处理 两个方面来对比分析。

2、Golang 与 Python 在错误处理上的设计理念

    1. Go 的错误处理哲学

显式 (Explicit) 优于隐式 (Implicit)

Go 选择了非常“啰嗦”的 if err != nil 风格,这是出于语言设计哲学:

程序员必须正视每一步可能失败的操作。

没有异常机制,错误就是普通的值 (error 接口),像函数返回值一样。

这种设计倾向于在“最靠近错误的地方”做处理,而不是抛给上层。

简单性 (Simplicity)

Go 避免了复杂的异常传播和栈回溯机制。语言的目标是简单、可预测,尤其面向大规模工程团队协作。
缺点是:代码会有很多重复的 if err != nil,不够优雅。

Go 的核心思想是:

		错误是正常的控制流一部分,必须显式处理,工程师要主动承担责任。

3. Python 的错误处理哲学

  • 异常驱动 (Exception-driven)

Python 借鉴了许多高级语言(Java、C++)的异常模型:

默认假设函数调用是成功的。

出错时通过 raise Exception 把错误抛到调用栈上,由调用方用 try/except 捕获。

  • 更符合人类直觉

在大部分业务逻辑中,异常是“少数情况”。因此 Python 允许我们写出更接近“理想路径”的代码,而异常只在错误发生时介入。

Python 的核心思想是:

		错误是非正常的情况,应该由异常机制捕获并统一处理。
  • 对比

     特点				Go									Python
    

    错误表示 error 接口,作为函数返回值 Exception 类层级体系
    错误处理方式 显式检查 (if err != nil) try/except 捕获
    哲学核心 错误是常见情况,必须显式处理 错误是例外情况,用异常统一处理
    代码风格 冗长,但显式、安全 简洁,贴近业务逻辑,但可能遗漏错误
    工程取向 强调可维护性和团队合作 强调可读性和快速开发

4 SQL 错误处理逻辑

SQL 本身并不像 Go/Python 一样有“异常模型”,但在执行过程中会产生错误,处理方式取决于 使用的环境:

  1. 在 SQL 语句层面

SQL 标准提供了 TRY…CATCH 结构(如 SQL Server 中):

  BEGIN TRY
      INSERT INTO users (id, name) VALUES (1, 'Alice');
  END TRY
  BEGIN CATCH
      SELECT ERROR_MESSAGE();
  END CATCH

MySQL/MariaDB 中存储过程支持 DECLARE … HANDLER:

    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
        SET @had_error = 1;
  • 在编程语言中使用 SQL(Go/Python)

数据库操作返回 error,需要显式检查:

    row := db.QueryRow("SELECT name FROM users WHERE id = ?", id)
    if err := row.Scan(&name); err != nil {
        // 处理SQL错误
    }
  • Python(PEP 249 DB API):

数据库操作抛出异常,需要 try/except 捕获:

    try:
        cursor.execute("SELECT name FROM users WHERE id = %s", (id,))
        name = cursor.fetchone()[0]
    except Exception as e:
        print("SQL执行出错:", e)
  • . 常见处理方法

捕获错误并记录日志:保证可追踪。

回滚事务:如果操作涉及事务(BEGIN/COMMIT/ROLLBACK),出错后应回滚。

错误恢复/重试:比如网络闪断时重试 SQL。

返回用户友好提示:避免直接暴露 SQL 错误。

5 小结:

Go 强调错误是正常控制流的一部分,要显式判断;

Python 强调错误是例外情况,用异常机制统一处理;

SQL 本身的错误处理能力有限,更多依赖 宿主语言(Go/Python)的错误模型和事务机制来保证健壮性。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。