2015-10-05 45 views
3

我简化了我的问题,使用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 ONQUOTED_IDENTIFIER,因为它们存在于我的测试程序

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

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

+0

你真的在测试这个程序吗?还是有另一个类似的程序? catch块中的'RETURN'关键字将确保在关键字'RETURN'执行后没有进入catch块。很难相信你在说什么。 –

+1

如果你真的使用2008,并且调用了'SET ARITHIGNORE ON',这可能会发生。 – developerwjk

+0

我试图设置ARITHABORT关和设置ARITHIGNORE关,只是为了确保他们不干扰。我仍然有同样的问题。错误处理在Management Studio中正常工作,但在被php调用时不起作用。 – cofporation

回答

1

我意识到这个线程是旧的,但我已经验证了这个错误。有问题的参数是ARITHABORT,PHP脚本需要在发送EXEC查询之前运行SET ARITHABORT ON query。您可以使用SET ARITHABORT OFF

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

0

您可以在过程开始时尝试SET XACT_ABORT ON。也许错误是由于试图在“exception”语句之后执行select语句。

+0

我试过你的提议。在管理工作室,这仍然正常工作,错误在catch块中处理,并且执行不会在try块中继续执行。但是,当被PHP调用时,这仍然不起作用,try块中的执行继续。我很困惑这个问题。 – cofporation

+0

我无法对以前的答案发表评论,但是可以使用'raiserror('Error',18,1)'来生成具有较高严重性的异常来解决PHP问题。 – Gabriel