吞下了错误
Error swallowed
问题
我正在使用 JayDeBeApi 连接到 SQL Server 2017 和 运行 一个脚本,例如:
- SELECT ...进入#a-temp-table
- 从-table
中删除
- 插入 a-table SELECT 来自 #a-temp-table
- 删除#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)
成功完成,所以没有抛出异常。 x
是 None
,在检查 localCursor
时,我没有看到任何错误消息/代码的迹象
-- 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 会干扰脚本执行的消息,除非您的代码处理多个结果集。
问题
我正在使用 JayDeBeApi 连接到 SQL Server 2017 和 运行 一个脚本,例如:
- SELECT ...进入#a-temp-table
- 从-table 中删除
- 插入 a-table SELECT 来自 #a-temp-table
- 删除#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)
成功完成,所以没有抛出异常。 x
是 None
,在检查 localCursor
时,我没有看到任何错误消息/代码的迹象
-- 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 会干扰脚本执行的消息,除非您的代码处理多个结果集。