我简化了我的问题,使用try catch块在MS SQL 2005中的简单存储过程。MS SQL尝试catch被php执行时被忽略mssql_query
,过程大概是:
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执行它,我得到以下结果:在TRY块
错误为什么我的catch块不会触发命令后,当遇到SQL错误?
我希望SQL停止进一步的执行并转到catch块,就像它在management studio中一样。
非常感谢您的帮助!
编辑:添加SET ANSI_NULLS ON
和QUOTED_IDENTIFIER
,因为它们存在于我的测试程序
编辑2:我用另一个错误由0变为师试过因为有人向我指出一些配置可能会忽略它们。我将其替换为一个失败的插入,它将返回“字符串或二进制数据将被截断”。同样的问题仍然存在。
编辑3:重要信息:我终于使它与PHP的工作不同的错误。我与drop table #notExistingTable
产生一个错误,这一次,它进入catch块,一切工作正常。但是除以零除或“字符串或二进制数据将被截断”。它不起作用。看起来像一些错误被忽略,一些触发catch块。在PHP中是否有特定的配置可以更改为与管理工作室相同并捕获相同的错误严重性?
你真的在测试这个程序吗?还是有另一个类似的程序? catch块中的'RETURN'关键字将确保在关键字'RETURN'执行后没有进入catch块。很难相信你在说什么。 –
如果你真的使用2008,并且调用了'SET ARITHIGNORE ON',这可能会发生。 – developerwjk
我试图设置ARITHABORT关和设置ARITHIGNORE关,只是为了确保他们不干扰。我仍然有同样的问题。错误处理在Management Studio中正常工作,但在被php调用时不起作用。 – cofporation