代码之家  ›  专栏  ›  技术社区  ›  Fredou

在SQL Server 2005上开始Try Catch,如何将错误信息发送给调用的父级?

  •  0
  • Fredou  · 技术社区  · 15 年前

    你有这个程序

        CREATE PROCEDURE dbo.test1
        AS
        BEGIN
            begin transaction
            begin try
              exec dbo.test2
              commit transaction
            end try
            begin catch
                SELECT
                    ERROR_NUMBER() AS ErrorNumber
                    ,ERROR_SEVERITY() AS ErrorSeverity
                    ,ERROR_STATE() AS ErrorState
                    ,ERROR_PROCEDURE() AS ErrorProcedure
                    ,ERROR_LINE() AS ErrorLine
                    ,ERROR_MESSAGE() AS ErrorMessage
               rollback transaction
            end catch
        END
    

    这一个

        CREATE PROCEDURE dbo.test2
        AS
        BEGIN
            begin transaction
            begin try
    
              commit transaction
            end try
            begin catch
               rollback transaction
                if @@trancount = 0
                begin
                    SELECT
                        ERROR_NUMBER() AS ErrorNumber
                        ,ERROR_SEVERITY() AS ErrorSeverity
                        ,ERROR_STATE() AS ErrorState
                        ,ERROR_PROCEDURE() AS ErrorProcedure
                        ,ERROR_LINE() AS ErrorLine
                        ,ERROR_MESSAGE() AS ErrorMessage
                 end
                 else
                    --return the select above to the parent while raising an error
            end catch
        END
    

    如何将错误重新引发到调用父级?

    我知道我能做到;

      raiserror(ERROR_MESSAGE(),ERROR_SEVERITY(),ERROR_STATE())
    

    但是如何得到 Error线() , 错误_过程() 错误编号() ?

    如果可能的话,我需要能够在每次捕获中都做同样的选择

    2 回复  |  直到 15 年前
        1
  •  0
  •   Mladen Prajdic    15 年前

    使用 raiserror 在你的孩子的存储过程中。

        2
  •  0
  •   gbn    15 年前

    我们使用一个存储过程(是UDF,但添加了异常日志记录),我们调用每个catch块来连接我们需要的内容并再次引发错误。

    调用存储过程再次调用错误处理程序并添加更多信息等。

    错误处理程序进程中有错误_xxx()函数,因为它在catch块范围内。

    最终,客户(在我们的例子中是C)会得到异常。