【问题标题】:MS SQL try catch ignored when executed by php mssql_query由 php mssql_query 执行时,MS SQL try catch 被忽略
【发布时间】:2024-01-20 13:03:01
【问题描述】:

我在 MS SQL 2005 中使用一个带有 try catch 块的简单存储过程简化了我的问题。

事情是这样的:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE testError

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

    BEGIN TRY
    DECLARE @X INT
    ---- Divide by zero to generate Error
        SET @X = 1/0
        select 'Command after error in TRY block' AS retour
    END TRY
    BEGIN CATCH
        select 'Error Detected' AS retour
        return
    END CATCH
    select 'Command after TRY/CATCH blocks' AS retour
END

当我在管理工作室中执行它时,我得到以下结果:检测到错误,这是我想要的。

但是当我在 PHP 5.3.2 中使用 mssql_query 执行它时,我得到以下结果:TRY 块中错误后的命令

为什么遇到 SQL 错误时没有触发我的 catch 块?

我希望 SQL 停止进一步执行并转到 catch 块,就像在管理工作室中所做的那样。

非常感谢您的帮助!

编辑:添加了SET ANSI_NULLS ONQUOTED_IDENTIFIER,因为它们存在于我的测试过程中

edit 2:我尝试通过另一个错误将除法更改为 0,因为有人指出我某些配置可能会忽略它们。我用一个失败的插入替换它,它返回“字符串或二进制数据将被截断。”。同样的问题仍然存在。

编辑 3:重要信息:我终于使它与 PHP 一起工作,但出现了不同的错误。我用drop table #notExistingTable 生成了一个错误,这一次,它进入了catch 块,一切正常。但是除以零或“字符串或二进制数据将被截断”。它不起作用。似乎有些错误被忽略了,有些则触发了 catch 块。是否有 PHP 中的特定配置可以更改为与管理工作室相同并捕获相同的错误严重性?

【问题讨论】:

  • 你真的在测试这个程序吗?还是有其他类似的程序?你的 catch 块中的 RETURN 关键字将确保一旦你进入 catch 块,在关键字 RETURN 被执行后什么都没有。很难相信你在说什么。
  • 如果你真的在使用 2008 并调用 SET ARITHIGNORE ON 这可能会发生。
  • 我尝试设置 ARITHABORT 关闭和 SET ARITHIGNORE 关闭只是为了确保它们没有干扰。我仍然有同样的问题。错误处理在 Management Studio 中可以正常工作,但在 php 调用时却不行。
  • M.Ali 是的,我只是在测试这个程序。我的真实过程中有很多其他的存储过程调用,我想以他最简单的形式测试这个问题。我还尝试从命令行调用测试过程,并且当 mssql_query 出现问题时,try catch 效果很好。我也尝试在我拥有的 Laravel 服务器上运行它,同样的问题发生了。
  • 你解决了吗?因为我也有同样的问题。

标签: php sql-server database sql-server-2005 try-catch


【解决方案1】:

我意识到这个帖子很旧,但我已经验证了这个错误。违规参数是ARITHABORT,PHP 脚本需要在发送EXEC 查询之前运行SET ARITHABORT ON query。您可以使用SET ARITHABORT OFF在管理工作室中进行复制

如果ARITHABORT = OFF 进行连接,则过程将在 DIV BY 0 行终止,并且不会执行 CATCH。

【讨论】:

    【解决方案2】:

    您可以在程序开始时尝试SET XACT_ABORT ON。可能错误是由于在“异常”语句之后尝试执行 select 语句。

    【讨论】:

    • 我试过你的提议。在管理工作室中,这仍然可以正常工作,错误在 catch 块中处理,并且在 try 块中执行不会进一步。但这在被 PHP 调用时仍然不起作用,try 块中的执行继续。我对这个问题很困惑。
    • 我无法评论上一个答案,但您可以使用raiserror ('Error', 18, 1) 生成更严重的异常来解决 PHP 问题,而不是除以零。
    最近更新 更多