当我试图学习Try...Catch时,我正在看MS提供的这个例子。我理解语法和输出(大部分情况下),但我有一个问题:
输出将显示Error_Line为'4‘。这很好,但是如果我删除GO和BEGIN TRY之间的行间隔,它将显示Error_Line为'3‘。我只想了解这里的逻辑。
我想象的是,Server是通过在GO之后立即开始批处理来计算行数的,即使该行是空白的,但我不确定这一点。有人能澄清吗?如果这个理论是正确的,那么如果脚本是用这样的断行符编写的,这难道不就很难找到错误吗?
-- Verify that the stored procedure does not already exist.
IF OBJECT_ID ( 'usp_GetErrorInfo', 'P' ) IS NOT NULL
DROP PROCEDURE usp_GetErrorInfo;
GO
-- 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
--Line 1
BEGIN TRY --Line 2
-- Generate divide-by-zero error. --Line 3
SELECT 1/0; --Line 4
END TRY
BEGIN CATCH
-- Execute error retrieval routine.
EXECUTE usp_GetErrorInfo;
END CATCH; 发布于 2017-10-03 05:58:11
您不能真正依赖ERROR_LINE(),特别是在内部存储过程中抛出错误或执行动态the语句时。
但是你真的需要精确的错误行吗?
这样,解决问题就更容易了。为了调试SQL例程:
drop和create内容基本上,您可能会发现以下两件事,而不是精确的错误行(如果有正确的输入参数和执行例程很容易就会很好):
usp_GetErrorInfo SP添加额外的参数,这也会产生SP名称)。CATCH子句中的错误-您只需在表中插入输入参数和有关错误的信息)有了这些信息,就可以很容易地复制并修复一个问题(在许多情况下)。
https://stackoverflow.com/questions/46528819
复制相似问题