【问题标题】:Procedure stops when legacy, new error traps are next to each other当旧的、新的错误陷阱彼此相邻时,过程停止
【发布时间】:2012-06-04 13:58:46
【问题描述】:

我们有一堆带有遗留样式错误捕获的旧存储过程。前几天我更改了一个,并包含了一个更新的 TRY...CATCH 块。存储过程刚刚在 TRY/CATCH 之后停止并返回,就好像遗留块中存在错误一样。

如果我放一个

SELECT NULL

在两者之间一切正常。有人知道为什么会这样吗?

--BEGIN NEW ERROR TRAP--
BEGIN TRY
Do stuff...
END TRY
BEGIN CATCH
END CATCH
--END NEW ERROR TRAP---
----------------- OLD SCHOOL TRAP BEGIN -----------------
SELECT  @spERROR = @@ERROR ,
        @spROWCOUNT = @@ROWCOUNT
SET @spRETURN = @spRETURN + 1
IF ( @spROWCOUNT <= 0
     OR @spERROR <> 0
   ) 
    SET @spRETURN = 0 - @spRETURN
IF ( @spROWCOUNT <= 0
     OR @spERROR <> 0
   ) 
    RETURN @spRETURN
SELECT  @spROWCOUNT = -1 ,
        @spERROR = -1
------------------ OLD SCHOOL ERROR TRAP END ------------------

【问题讨论】:

  • 你怎么知道它停止工作了?您的 RETURN 并不总是被击中

标签: sql error-handling try-catch


【解决方案1】:

在您的 try catch 块中,最后一条语句可能正在执行将行数设置为 0 的操作。“SELECT NULL”将行数设置为 1,因为它返回一行,因此未检测到错误。

您可以通过更改“旧”代码中的逻辑或在 try/catch 代码中设置行计数变量来解决此问题。我建议您删除 SELECT NULL,因为它可以保证成功并且您可能不希望这种行为。

【讨论】:

  • 如果我将 SELECT NULL 放在 TRY 部分的末尾会怎样?
  • 这将有助于重置行数。你需要保留遗留代码吗?将所有内容更改为 try/catch 块会更干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多