如何优雅处理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助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2544083.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!