吞下了错误

Error swallowed

问题

我正在使用 JayDeBeApi 连接到 SQL Server 2017 和 运行 一个脚本,例如:

  1. SELECT ...进入#a-temp-table
  2. 从-table
  3. 中删除
  4. 插入 a-table SELECT 来自 #a-temp-table
  5. 删除#a-temp-table

在第 3 步中出现以下错误:

Cannot insert duplicate key row in object 'dbo.a-table' with unique index 'UQ_a-table'. The duplicate key value is (11, 0001, 3751191, T70206CAT, 0000).

只插入了 ~180k 条记录,而不是 ~360k 条记录。所以第 3 步中止。 然而,temp table 被删除了。至此第 4 步完成。

我可以修复错误。但是对于 JayDeBeApi,我没有看到错误。 从 Python 的角度来看,似乎一切都很顺利。

我的目标是捕获这些错误以适当地处理它们。 知道如何实现吗?

我试过的

我的 Python 代码看起来像。

try:
    localCursor = dbConnection.cursor()
    x = localCursor.execute(query)
        
    logInfo("Run script %s... done" % (scriptNameAndPath), "run script", diagnosticLog)
except Exception as e:
    logError("Error running sql statement " + scriptNameAndPath + ". Skipping rest of row.", 
        "run script", e, diagnosticLog)
    myrow = skipRowAndLogRecord(startRowTime, cursor, recordLog)
    continue

x = localCursor.execute(myqrystm) 成功完成,所以没有抛出异常。 xNone,在检查 localCursor 时,我没有看到任何错误消息/代码的迹象

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-2017

-- Create procedure to retrieve error information.  
CREATE PROCEDURE usp_GetErrorInfo  
AS  
SELECT  
ERROR_NUMBER() AS ErrorNumber  
,ERROR_SEVERITY() AS ErrorSeverity  
,ERROR_STATE() AS ErrorState  
,ERROR_PROCEDURE() AS ErrorProcedure  
,ERROR_LINE() AS ErrorLine  
,ERROR_MESSAGE() AS ErrorMessage;  
GO  

BEGIN TRY  
-- Generate divide-by-zero error.  
SELECT 1/0;  
END TRY  
BEGIN CATCH  
-- Execute error retrieval routine.  
EXECUTE usp_GetErrorInfo;  
END CATCH;   

第 3 步应该是 all-or-none,所以 a-table 应该在重复键错误之后为空,除非您的实际代码有 WHERE 子句。

关于未检测到的异常,将SET NOCOUNT ON添加为脚本中的第一条语句。这将抑制 DONE_IN_PROC 会干扰脚本执行的消息,除非您的代码处理多个结果集。