捕捉RAISERROR异常

    在写存储过程时,我们常常会使用RAISERROR语句来抛出一个自定义异常。

    如何在.net程序中来捕捉这个异常。framework类库为我们提供了一个SqlException异常类型,该类型是当 SQL Server 返回警告或错误时引发的异常。

    一个存储过程中可以有多个RAISERROR语句来抛出的异常,如何捕捉到具体的哪一个?

    RAISERROR语句中有一个参数state,MSDN具体定义如下:

    0 到 255 之间的整数。 负值或大于 255 的值将生成错误。 

    如果在多个位置引发相同的用户定义错误,则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。
    在存储过程中,我们可以对要特殊处理的异常,对RAISERROR语句设置一个不同的state值。在程序中就可以SqlException异常的 Procedure属性(存储过程名称)和State属性 (RAISERROR语句设置的state参数),来确定具体的异常,然后进行特殊的处理。
    代码如下:

    存储过程

CREATE PROC PROC_NAME          
BEGIN      
 --一般的异常,state参数的值为1
 IF(....)     
 BEGIN     
  SET @ErrorInfo = '';           
  RAISERROR(@ErrorInfo, 16, 1) WITH NOWAIT;             
  RETURN;         
 END
 
 --要捕捉特殊处理的异常,可以设置一个不同的state参数 例如:66
 IF(....)     
 BEGIN     
  SET @ErrorInfo = '';           
  RAISERROR(@ErrorInfo, 16, 66) WITH NOWAIT;             
  RETURN;         
 END   
END
GO

 程序中的处理

            try
            {

            }
            catch (System.Data.SqlClient.SqlException e)
            {
                //如果是存储过程名称是PROC_NAME,而且State是数据库中设置的一个值 如:66
                //则该异常就是我们需要特殊处理的一个异常
                if (e.Procedure.Equals("PROC_NAME") && e.State == 66)
                {
                    //特殊处理......
                }
            }
            catch (Exception e)
            {

            }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值