当前位置:数据库 > 其它> 正文

存储过程异常处理

时间:2014-7-26类别:数据库

存储过程异常处理

存储过程异常处理

一、存储过程使用 try......catch异常处理

 

TRY 块以 BEGIN TRY 语句开头,以 END TRY 语句结尾。在 BEGIN TRY 和 END TRY 语句之间可以指定一个或多个 Transact-SQL 语句。

CATCH 块必须紧跟 TRY 块。

CATCH 块以 BEGIN CATCH 语句开头,以 END CATCH 语句结尾。

在 Transact-SQL 中,每个 TRY 块仅与一个 CATCH 块相关联。

 

二、TRY……CATCH基本语法如下

  •  
  • SQL 代码   复制
  • 
       BEGIN TRY
        RAISERROR'Houston, we have a problem', 16,1  END TRY
      BEGIN CATCH
         SELECT ERROR_NUMBER() as ERROR_NUMBER,   //返回错误号。
        ERROR_SEVERITY() as ERROR_SEVERITY,      //返回错误严重性。
        ERROR_STATE() as ERROR_STATE,            //返回错误状态号。
        ERROR_MESSAGE() as ERROR_MESSAGE         //返回错误消息的完整文本。此文本包括为任何可替换参数(如长度、对象名称或时间)提供的值。
          ERROR_LINE()  as ERROR_LINE,              //返回导致错误的例程中的行号。
          ERROR_PROCEDURE()  as ERROR_PROCEDURE,    //返回出现错误的存储过程或触发器的名称。
      END CATCH
    
    		
  •  

    存储过程错误消息

  •  
  • SQL 代码   复制
  • 
    if (object_id('proc_error_info') is not null)
        drop procedure proc_error_info
    go
    create proc proc_error_info
    as
        select 
            error_number() '错误编号',
            error_message() '错误消息',
            error_severity() '严重性',
            error_state() '状态好',
            error_line() '错误行号',
            error_procedure() '错误对象(存储过程或触发器)名称';
    go
    
    		
  •  

    用异常处理错误信息

  •  
  • SQL 代码   复制
  • 
    --简单try catch示例
    begin try
        select 1 / 0;
    end try
    begin catch
        exec proc_error_info; --调用错误消息存储过程
    end catch
    go
    
    			
  •  

  •  
  • SQL 代码   复制
  • 
    --
    --简单try catch示例,无法处理错误
    begin try
        select * * from student;
    end try
    begin catch
        exec proc_error_info;
    end catch
    go
    --
    --简单try catch示例,不处理错误(不存在的表对象)
    begin try
        select * from st;
    end try
    begin catch
        exec proc_error_info;
    end catch
    go
    --
    --异常处理,能处理存储过程(触发器)中(不存在表对象)的错误信息
    if (object_id('proc_select') is not null)
        drop procedure proc_select
    go
    create proc proc_select
    as
        select * from st;
    go
    begin try
        exec proc_select;
    end try
    begin catch    
        exec proc_error_info;
    end catch
    go
    
    		
  •  

     异常不能处理编译期的错误,如语法错误。以及重编译造成部分名称对象得不到正确解析的时候所出现的错误。

     

    处理异常日志信息

  •  
  • SQL 代码   复制
  • 
    ---异常、错误信息表
    if (object_id('errorLog', 'U') is not null)
        drop table errorLog
    go
    create table errorLog(
        errorLogID int primary key identity(100, 1),    --ErrorLog 行的主键。
        errorTime datetime default getDate(),            --发生错误的日期和时间。
        userName sysname default current_user,            --执行发生错误的批处理的用户。
        errorNumber int,                                --发生的错误的错误号。
        errorSeverity int,                                --发生的错误的严重性。
        errorState int,                                    --发生的错误的状态号。
        errorProcedure nvarchar(126),                    --发生错误的存储过程或触发器的名称。
        errorLine int,                                    --发生错误的行号。
        errorMessage nvarchar(4000)
    )
    go
    --
    --存储过程:添加异常日志信息
    if (object_id('proc_add_exception_log', 'p') is not null)
        drop proc proc_add_exception_log
    go
    create proc proc_add_exception_log(@logId int = 0 output)
    as
    begin
        set nocount on;
        set @logId = 0;
        begin try
            if (error_number() is null)
                return;
            
            if (xact_state() = -1)
            begin
                print '会话具有活动事务,但出现了致使事务被归类为无法提交的事务的错误。'
                    + '会话无法提交事务或回滚到保存点;它只能请求完全回滚事务。'
                    + '会话在回滚事务之前无法执行任何写操作。会话在回滚事务之前只能执行读操作。'
                    + '事务回滚之后,会话便可执行读写操作并可开始新的事务。';
            end
            else if (xact_state() = 0)
            begin
                print '会话没有活动事务。';
            end
            else if (xact_state() = 1)
            begin
                print '会话具有活动事务。会话可以执行任何操作,包括写入数据和提交事务。';
            end
            
            --添加日志信息
            insert into errorLog values(getDate(), 
                current_user, error_number(), 
                error_severity(), error_state(), 
                error_procedure(), 
                error_line(), error_message());
            --设置自增值
            select @logId = @@identity;
        end try
        begin catch
            print '添加异常日志信息出现错误';
            exec proc_error_info;--显示错误信息
            return -1;
        end catch
    end
    go
    --
    ---处理异常信息示例
    declare @id int;
    begin try
        begin tran;
        --删除带有外键的记录信息
        delete classes where id = 1;
        commit tran;
    end try
    begin catch
        exec proc_error_info;--显示错误信息
        if (xact_state() <> 0)
        begin
            rollback tran;
        end
        exec proc_add_exception_log @id output
    end catch
    select * from errorLog where errorLogID = @id;
    go
    
    		
  •  

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐