我用一个简单的存储过程在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
当我在管理工作室执行它时,我得到以下结果:Error Detected,这是我想要的。
但是当我在PHP 5.3.2中使用mssql_query执行它时,我得到以下结果:Command after error in TRY block
当遇到SQL错误时,为什么我的catch块不触发?
我希望SQL停止进一步执行并进入catch块,就像它在管理工作室中所做的那样。
谢谢你的帮助!
编辑:添加SET ANSI_NULLS ON
和QUOTED_IDENTIFIER
,因为它们存在于我的测试过程
edit 2:我尝试通过另一个错误更改除0,因为有人指出我一些配置可能会忽略它们。我用一个失败的插入替换了它,它返回"字符串或二进制数据将被截断。"同样的问题仍然会发生。
编辑3:重要信息:我终于使它工作与PHP不同的错误。我生成一个错误与drop table #notExistingTable
,这一次,它去捕捉块,一切工作正常。但对于除零或"字符串或二进制数据将被截断",它不起作用。似乎有些错误会被忽略,有些则会触发catch块。在PHP中是否有一个特定的配置,我可以改变为与管理工作室相同的行为,并捕获相同的错误严重程度?
我意识到这个线程是旧的,但我已经验证了这个错误。有问题的参数是ARITHABORT
, PHP脚本需要在发送EXEC
查询之前运行SET ARITHABORT ON query
。您可以使用SET ARITHABORT OFF
如果连接为ARITHABORT = OFF
,则过程将在DIV BY 0行终止,并且不会执行CATCH。
您可以在程序开始时尝试SET XACT_ABORT ON
。可能错误是由于尝试在"exception"语句之后执行select语句。