首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TRY..CATCH Error_Line()....line

TRY..CATCH Error_Line()....line
EN

Stack Overflow用户
提问于 2017-10-02 15:36:17
回答 1查看 1.6K关注 0票数 0

当我试图学习Try...Catch时,我正在看MS提供的这个例子。我理解语法和输出(大部分情况下),但我有一个问题:

输出将显示Error_Line为'4‘。这很好,但是如果我删除GOBEGIN TRY之间的行间隔,它将显示Error_Line为'3‘。我只想了解这里的逻辑。

我想象的是,Server是通过在GO之后立即开始批处理来计算行数的,即使该行是空白的,但我不确定这一点。有人能澄清吗?如果这个理论是正确的,那么如果脚本是用这样的断行符编写的,这难道不就很难找到错误吗?

代码语言:javascript
复制
-- 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; 
EN

回答 1

Stack Overflow用户

发布于 2017-10-03 05:58:11

您不能真正依赖ERROR_LINE(),特别是在内部存储过程中抛出错误或执行动态the语句时。

但是你真的需要精确的错误行吗?

  1. 在实际的生产代码中,导致错误的行的修复可能不像在示例中那么明显;
  2. 最好用相应的输入参数来调试存储过程或函数,以便重现错误。

这样,解决问题就更容易了。为了调试SQL例程:

  1. 就写个剧本
  2. 删除dropcreate内容
  3. 在输入参数前面添加声明,并使用导致错误的值初始化它们。

基本上,您可能会发现以下两件事,而不是精确的错误行(如果有正确的输入参数和执行例程很容易就会很好):

  • 哪个路由导致错误(例如,您可以向用户usp_GetErrorInfo SP添加额外的参数,这也会产生SP名称)。
  • 导致错误的输入参数(可以使用分隔的表记录CATCH子句中的错误-您只需在表中插入输入参数和有关错误的信息)

有了这些信息,就可以很容易地复制并修复一个问题(在许多情况下)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46528819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档