我使用带有 try catch block 的 MS SQL 2005 中的简单存储过程简化了我的问题。
它是这样的:
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
当我在 Management Studio 中执行它时,我得到以下结果:检测到错误,这正是我想要的。
但是当我在 PHP 5.3.2 中使用 mssql_query 执行它时,我得到以下结果: Command after error in TRY block
为什么遇到SQL错误时我的catch block 没有被触发?
我希望 SQL 停止进一步执行并转到 catch block ,就像在 Management Studio 中一样。
非常感谢您的帮助!
编辑:添加了 SET ANSI_NULLS ON
和 QUOTED_IDENTIFIER
因为它们存在于我的测试程序中
编辑 2:我尝试通过另一个错误将除法更改为 0,因为有人指出我一些配置可能会忽略它们。我用一个失败的插入替换了它,它返回“字符串或二进制数据将被截断”。还是出现同样的问题。
编辑 3:重要信息: 我终于让它与 PHP 一起工作,但出现了不同的错误。我使用 drop table #notExistingTable
生成了一个错误,这一次,它进入了 catch block 并且一切正常。但是除以零或“字符串或二进制数据将被截断”。它不起作用。似乎有些错误被忽略了,有些错误触发了 catch block 。 PHP 中是否有特定的配置,我可以将其更改为与 management studio 相同的行为并捕获相同的错误严重性?
最佳答案
我意识到这个线程是旧的,但我已经验证了这个错误。有问题的参数是 ARITHABORT
,PHP 脚本需要在发送 EXEC
查询之前运行 SET ARITHABORT ON query
。您可以使用 SET ARITHABORT OFF
如果 ARITHABORT = OFF
连接,过程将在 DIV BY 0 行终止,并且不会执行 CATCH。
关于php - MS SQL try catch 在被 php mssql_query 执行时被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32957326/