You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程抛出的异常无法被Entity Framework捕获

问题

在Azure SQL Server上有存储过程usp_MyStoredProc,其BEGIN CATCH块中用RAISERROR抛出自定义异常。在基于.NET Core 7的ASP.NET Core项目中,通过Entity Framework的ExecuteSqlRawAsync调用该存储过程时,无法捕获自定义错误信息,但在Azure Data Studio中执行对应SQL语句能正常返回错误信息。

已做尝试:

  • 将THROW替换为RAISEERROR且设置severity大于10,无效;
  • 修改为直接使用SqlCommand调用存储过程,仍无法捕获异常;
  • 该存储过程已在ASP.NET .NET Framework 4.8 MVC应用中正常工作,无法修改。

解决方案

1. 检查连接字符串配置

确保连接字符串未启用MultipleActiveResultSets=True(MARS),MARS可能导致异常延迟或丢失。若必须启用MARS,需保证读取完所有结果集后再捕获异常。

2. 调整RAISERROR参数设置

确认RAISERROR的参数配置:

  • 将state参数设为非0值(如1),部分场景下state=0会被识别为警告而非错误;
  • 添加WITH SETERROR选项强制标记为严重错误,示例:
RAISERROR('自定义错误信息', 16, 1) WITH SETERROR;

3. EF Core中正确捕获异常

捕获SqlException而非泛型Exception,并遍历SqlException.Errors集合获取自定义错误,示例代码:

try
{
    await _dbContext.Database.ExecuteSqlRawAsync("EXEC usp_MyStoredProc @Param1, @Param2", param1, param2);
}
catch (SqlException ex)
{
    var customError = ex.Errors.Cast<SqlError>().FirstOrDefault(e => e.Class >= 10);
    if (customError != null)
    {
        string errorMessage = customError.Message;
        // 处理自定义错误逻辑
    }
}

4. 检查存储过程错误传播逻辑

确认存储过程BEGIN CATCH块中未存在吞掉异常的逻辑,比如RAISERROR后是否执行了RETURN,或嵌套TRY/CATCH是否阻止错误向上传播。

5. SqlCommand调用的正确写法

若直接使用SqlCommand,需调用ExecuteNonQueryAsync并正确捕获SqlException,示例:

using (var conn = new SqlConnection(_connectionString))
{
    await conn.OpenAsync();
    using (var cmd = new SqlCommand("usp_MyStoredProc", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Param1", param1);
        
        try
        {
            await cmd.ExecuteNonQueryAsync();
        }
        catch (SqlException ex)
        {
            var customError = ex.Errors.Cast<SqlError>().FirstOrDefault(e => e.Class >= 10);
            // 处理错误逻辑
        }
    }
}

内容的提问来源于stack exchange,提问作者hiFI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:52:11