You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中通过PL/pgSQL将异常信息插入错误日志表

如何用PL/pgSQL捕获异常并插入错误日志表

咱们来拆解一下这段PL/pgSQL代码是怎么把异常信息写入数据表的,一步一步看清楚:

1. 代码整体逻辑概述

这是一个匿名PL/pgSQL块(用DO $$ ... $$包裹),作用是触发一个除零异常,捕获后把错误信息输出并插入到TB_ERRORLOG表中。完整代码如下:

do $$ begin
Select (2 / 0)
exception when others then
RAISE INFO 'Error Name:%',SQLERRM;
RAISE INFO 'Error State:%', SQLSTATE;
Insert into TB_ERRORLOG(msg) values('Error =' || SQLERRM || SQLSTATE);
END; $$ language 'plpgsql';

2. 触发异常的核心操作

  • Select (2 / 0):这行代码故意触发除零异常——数学上除数不能为0,PostgreSQL会立刻抛出对应的错误,进入后续的异常捕获逻辑。

3. 异常捕获与信息获取

  • exception when others then:这是PL/pgSQL的异常捕获入口,when others表示捕获所有类型的异常(不管是什么错误都会进到这个块里处理)。
  • 内置错误变量:
    • SQLERRM:存储错误的详细描述文本,比如这里会返回division by zero。
    • SQLSTATE:存储标准的PostgreSQL错误代码,除零对应的错误代码是22012。
  • RAISE INFO:这两行是用来在控制台输出错误信息的调试语句,不是必须的,但能帮你直观看到捕获到的错误内容,方便排查。

4. 插入错误日志表的操作

  • Insert into TB_ERRORLOG(msg) values('Error =' || SQLERRM || SQLSTATE);:通过字符串连接符||把固定文本、错误描述、错误代码拼接成一条完整的错误信息,插入到TB_ERRORLOG表的msg字段中。最终插入的内容类似Error =division by zero22012。

实用注意事项

  • 确保TB_ERRORLOG表已存在:如果还没创建,建议加个自增ID和创建时间字段,让日志更易追踪:
    CREATE TABLE TB_ERRORLOG (
        id SERIAL PRIMARY KEY,
        msg TEXT NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    
  • 精准捕获特定异常:如果不需要捕获所有错误,可以把when others换成具体的错误类型,比如只处理除零异常就用when division_by_zero then,这样其他类型的错误会直接抛出,不会进入捕获块。

内容的提问来源于stack exchange,提问作者user619

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:43:44