DarknessHover

SQL异常捕捉

捕捉异常:try---catch

SQL提供了和编程语言类似的try-catch机制,帮助存储过程更加健壮,不至于遇到任何错误就终结存储过程。在try的语句块中遇到异常后,会暂停执行trySQL语句,并跳转到最近的catch代码块中继续执行。

语法框架

 

Begin try
    Begin
        [需要执行的SQL语句]
    End
End try

Begin catch
    Begin
        [在上一个begin try和end try中一旦产生异常,就会停止执行
        剩下的语句,并跳转到begin catch和end catch的语句中继续
        执行]
    End
End catch

 

 

 

制造异常

SQL server为例,它提供了raiserror()函数用于抛出异常。其实有很多编程语言都提供了相似的异常捕获机制,因此这种机制对于有编程基础的小伙伴来说会非常熟悉。

raiserror()的语法结构

1 RAISERROR ( { msg_id | msg_str | @local_variable }        
2             { ,severity ,state }        
3             [ ,argument [ ,...n ] ]
4           )       
5    [ WITH option [ ,...n ] ]

 

这个函数中各个参数的意义可以参考这一篇文章,我在此不做太多赘述:

https://www.cnblogs.com/xugang/archive/2011/04/09/2010216.html

这五个参数中的后两个可以不填,因此可以将这个函数简化成一下形式:

1 RAISERROR (msg_str,severity,state)       
2  /*
3 msg_str:用户自定义的错误消息
4 Severity:错误级别。任何用户都可以指定 0 到 18 之间的严重级别。[0,10]的闭区间内,不会跳到catch;如果是[11,19],则跳到catch;如果[20,无穷),则直接终止数据库连接
5 State:介于 1 至 127 之间的任意整数。(state 默认值为1)当state 值为 0 或大于 127 时会生成错误!
6 */

 

raiserror()的简单用法

在刚接触编程时,我对这种人为产生异常的行为非常困惑——我们写SQL语句都是尽量避免报错,为什么还要主动生成错误?

在实际使用中,这个函数常常配合判断语句用于定位错误位置,区分错误类型。

Begin try
    Begin
        If (条件一)
            raiserror(错误1,11,1)
        If (条件二)
            raiserror(错误2,11,2)
        If (条件三)
            raiserror(错误3,11,3)
    End
End try
Begin catch
    Begin
        [遇到异常后执行的语句]
    End    
End catch

 

常用的和异常相关的系统函数

通过这些函数可以帮助我们更好的定位和判断错误信息

ERROR_NUMBER() --返回错误号。
ERROR_SEVERITY() --返回严重性。
ERROR_STATE() --返回错误状态号。
ERROR_PROCEDURE() --返回出现错误的存储过程或 触发器的名称。
ERROR_LINE() --返回导致错误的例程中的行 号。
ERROR_MESSAGE() --返回错误消息的完整文本。

 

posted on 2021-12-10 17:44  DarknessHover  阅读(1131)  评论(0编辑  收藏  举报

导航