如何优雅处理SQL存储过程异常_使用TRY-CATCH块机制

TRY-CATCH只捕获运行时错误(如除零、主键冲突),不捕获编译期错误(如语法错、对象不存在);DDL语句出错可能中断批处理,CATCH来不及触发;RAISERROR需≥11级才被捕获;CATCH中须立即用ERROR_*函数保存错误信息;事务回滚前须检查XACT_STATE()。SQL Server 里 TRY-CATCH 不生效?检查是否在批处理顶层TRY-CATCH 在 SQL Server 中只捕获运行时错误(如除零、主键冲突),但不捕获编译期错误(如语法错、对象不存在)------这类错误根本不会进入 TRY 块。最常见误用是把 TRY-CATCH 写在存储过程内部却忘了它只对当前批处理有效。确保 TRY 块从批处理开头开始,不要嵌套在 IF 或循环里再起 BEGIN TRYDDL 语句(如 CREATE TABLE)若出错,可能直接中断批处理,CATCH 来不及触发;建议先用 OBJECT_ID() 检查对象是否存在RAISERROR 的严重级别必须 ≥ 11 才能被 CATCH 捕获;级别 10 及以下是"信息性消息",会直接输出并继续执行如何在 CATCH 块里拿到完整错误信息仅靠 ERROR_MESSAGE() 往往不够,比如主键冲突时提示模糊,你得结合上下文定位问题。SQL Server 提供一组 ERROR_* 函数,必须在 CATCH 块第一行就保存,否则后续语句可能覆盖它们的值。立刻存入变量:DECLARE @msg NVARCHAR(4000) = ERROR_MESSAGE(); DECLARE @sev INT = ERROR_SEVERITY();ERROR_LINE() 返回出错语句所在行号,但注意:它指代的是 TRY 块内语句的行号,不是整个存储过程文件的行号日志记录时建议拼接:CONCAT('Proc:', OBJECT_NAME(@@PROCID), '; Line:', ERROR_LINE(), '; Msg:', ERROR_MESSAGE())事务在 TRY-CATCH 中没回滚?检查 XACT_STATE()很多人以为进了 CATCH 就自动可以 ROLLBACK,结果报错 The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION。根本原因是:某些错误(如约束冲突)会让事务进入"不可提交"状态,但事务本身未必已显式开启。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
我的xiaodoujiao5 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
笃行3505 小时前
国产化落地避坑 · 干货向|Oracle 迁金仓 KES,我把外连接消除排在隐性陷阱第一位
数据库
weixin_408099675 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
老纪的技术唠嗑局5 小时前
花一年时间整理出的:AI 数据库混合搜索入门实践
数据库
去码头整点薯条ing6 小时前
某当网登录滑块【协议+OCR】
爬虫·python·ocr
川石课堂软件测试6 小时前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
笃行3506 小时前
国产化落地避坑 · 干货向|迁移后那条「测试能过、一上生产就查空」的 SQL,多半栽在 WHERE 函数顺序上
数据库
赶紧写完去睡觉7 小时前
Anaconda 创建虚拟环境与使用
python·pycharm·conda
迷途呀7 小时前
Python:函数中的参数类型
开发语言·笔记·python·langchain·nlp
蓝田~7 小时前
MySQL慢查询怎么优化?B+Tree索引原理+MVCC读不阻塞写+EXPLAIN执行计划,从5秒到0.05秒
数据库·mysql