如何知道存储过程中是否存在错误,该错误在c#代码中处理了TRY CATCH

时间:2017-11-01 03:28:13

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

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

案例1:

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#代码捕获。

谢谢。

麦克

2 个答案:

答案 0 :(得分:0)

我们可以使用以下方法获取所有可能的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块中处理所有可能的异常。

答案 1 :(得分:0)

在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错误处理的一个原因主要是正确回滚事务。之后,您应该抛出错误,以便客户端应用程序将了解错误。