如何在存储过程中进行错误处理

3

我目前正在使用Sybase ASE 12.5。我有以下的代码:

create procedure test_launcher_fail_wrapper
as
begin

   select convert(numeric(2),1234345)

   if @@error != 0
   begin
      select "SP failed to execute"
      return 1
   end

end

这里,我试图将一个非常大的值/金额(1234345)转换为 Numeric 大小 2。这是不可能的,并且会生成错误。

问题:

  1. 在这里使用 @@error 有用吗?我运行了这个存储过程,但它从未进入错误处理。
  2. 如何处理这类情况的错误?

为什么会有关闭投票?这是一个非常好的、明确的问题,希望能得到一些有趣的答案。SQL 存储过程是程序,错误处理是一个已知的问题领域。 - James Anderson
1
适合放在stackoverflow上。 - Erich Kitzmueller
请原谅我的无知。但如果这个问题属于不同的论坛,管理员可以将其移动。不想重复发布。 - Meet Agrawal
它没有在try和catch块中吗? - ediblecode
可以迁移这个问题。 - ChrisF
谢谢Chris。请问您能否将问题移动一下。 - Meet Agrawal
3个回答

0

这个能捕获你的错误吗?

create procedure test_launcher_fail_wrapper
as
begin

  declare @database_err int

  set @database_err = 0

  select convert(numeric(2),1234345)

  set @database_err = @@error

  if @database_err <> 0
  begin
    PRINT  'SP failed to execute'
    return 1
  end

end

0

@@error 是正确的选择,但需要注意:

每个 Transact-SQL 语句(包括 print 语句和 if 判断)都会重置 @@error,因此状态检查必须紧随可能出错的批处理。

至于在类似情况下如何处理错误管理的建议,您考虑过使用 raiserror 吗?

以下是一个示例:

create procedure proc1 as
begin
    select convert(numeric(2),1234345)
    if @@error <> 0
    begin
        raiserror 20001 "Error during convert in proc1"
        return 1
    end
end

0

我在处理过程中的错误处理方式与应用程序中的错误处理方式类似——如果您有机会通过处理错误来提供一些实际价值,那么请务必这样做,但如果您无法真正帮助到任何人,那么最好就让它自然而然地发生。

举个增加价值的例子,我有一两个过程可以在错误消息中添加上下文信息,例如与更新操作冲突的ID值列表。在这种特殊情况下,我知道过程的上游使用者将记录此错误,并且当调试问题时,操作员将找到此信息非常有价值。我也知道,虽然这种情况是一个真正的错误,但它已经被知道时不时会发生,因此格式化错误的工作是值得的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接