【问题标题】:How to know if there is an error in stored procedure which have TRY CATCH handling in c# code如何知道在 C# 代码中进行 TRY CATCH 处理的存储过程中是否存在错误
【发布时间】:2018-04-13 08:27:30
【问题描述】:

让我解释一下场景:我有这个代码和存储过程。

案例一:

C#代码:

try 
{
     call uspMyProcedure using ado.net 
}
catch 
{
     Log exception 
}

存储过程

uspMyProcedure (*without try catch*)

这种情况1,我可以知道存储过程中是否有错误,因为C#代码中捕获了异常。

案例 2:

C#代码:

try 
{ 
    call uspMyProcedure using ado.net 
}
catch 
{
    Log exception 
}

存储过程

uspMyProcedure (*with try catch*)

这种情况2,我怎么知道存储过程中是否有错误,因为异常没有在C#代码中捕获。

谢谢。

迈克

【问题讨论】:

  • 存储过程中有try-catch吗?
  • @MathewPaxinos 是的,如果 try-catch 在存储过程中。

标签: c# sql-server stored-procedures error-handling try-catch


【解决方案1】:

在 SQL Server 中,您可以在 catch 语句中重新抛出错误。例如:-

SQL Server 2012 或更高版本

BEGIN TRY  
.....
END TRY  
BEGIN CATCH    
    PRINT 'In catch block.';  
    THROW;  
END CATCH;

早于 SQL Server 2012

BEGIN TRY
....
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage nvarchar(max), @ErrorSeverity int, @ErrorState int
    SELECT @ErrorMessage = N'Error Number: ' + CONVERT(nvarchar(5), ERROR_NUMBER()) + N'. ' + ERROR_MESSAGE() + ' Line ' + CONVERT(nvarchar(5), ERROR_LINE()), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE()
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH

在 SQL Server 中,try-catch 错误处理的一个原因主要是为了正确回滚事务。之后,您应该抛出错误,以便客户端应用程序了解该错误。

【讨论】:

  • 非常感谢您@Chamika 的解释。解释得很好。
  • 嗨@Chamika,我已经尝试过了,THROW 不会投向客户端(意味着不会投向 asp.net)。
  • 嗨@Mike,我刚才也试过了。但它对我有用(错误在客户端应用程序中被捕获)。我的电脑上安装了 SQL Server 2016。但我确信功能与 2012 和 2014 版本相同。
  • 嗨@Chamika,最后,扔;像魅力一样工作。谢谢。 (竖起大拇指)
【解决方案2】:

我们可以使用以下方法获取所有可能的 SQL 异常:

SELECT * FROM sysmessages

这些异常可以在try catch块中处理:

try
{
    //code
}
catch(SqlException sqlEx)
{
        if (sqlEx.Message.StartsWith("Invalid object name"))
        {
            //code
        }
        else
            throw;
}

另一种了解可能错误的方法:

直接在 sql-server 上执行和调试您的存储过程,稍后您可以在 try-catch 块中处理所有可能的异常。

【讨论】:

  • 感谢您的回答@Mohit
  • 嗨@Mohit,这就是重点。如果存储过程使用了TRY CATCH,.Net try catch 中不会抛出异常。对吗?
猜你喜欢
  • 2012-03-23
  • 2019-05-19
  • 2020-03-08
  • 2014-12-13
  • 2020-07-11
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多