【问题标题】:How can i catch error in C# from RAISERROR of sql server?如何从 sql server 的 RAISERROR 中捕获 C# 中的错误?
【发布时间】:2016-11-16 03:28:28
【问题描述】:

这是我的名为“uspTest”的存储过程代码

BEGIN TRY
SELECT 3 / 0;
END TRY

BEGIN CATCH
RAISERROR('D', 16, 3);
END CATCH

这是我在 Visual Studio 中的 c# 代码

    public IHttpActionResult RegisterUser(RegisterModelView registerViewModel)
    {

        try
        {
            using (AusHerbEntities ctx = new AusHerbEntities())
            {
                ctx.uspTest();  
                Console.Write("i am in try block");
            }


        }

        catch (Exception e)
        {
            Console.Write(e.Message);

        }
        return Ok();
    }

当我运行这段代码时,C# 代码中的 Catch 块没有被调用,但我希望它会被调用,因为存储过程会引发错误。

我怎样才能让这段代码工作?

我只想在存储过程的 catch 块中做 RAISERROR 并在 c# 代码中捕获错误。

【问题讨论】:

  • 您的代码似乎在做您认为应该做的事情。你有没有设置断点看看会发生什么?
  • 我也可以确认,sql 中的语法看起来是正确的。你可以检查这个问题,我不知道这是不是你的问题:stackoverflow.com/questions/33502318/…
  • 我刚刚又试了一次还是不行,执行存储过程的tread已经过期,0表示没有抛出异常?
  • #Sean Lange 是的,它不会调用 catch 块
  • 如果您只在您的uspTest 中输入RAISERROR('D', 16, 3); 会引发错误吗?

标签: c# sql-server


【解决方案1】:

要抛出SqlException,存储过程必须返回并设置@@error。在您的情况下,END CATCH 语句清除了@@error。在RAISERROR 语句之后立即插入RETURN 语句应该会抛出SqlException

BEGIN TRY
SELECT 3 / 0;
END TRY

BEGIN CATCH
RAISERROR('D', 16, 3);
RETURN;
END CATCH

【讨论】:

  • 我试过了,但是很抱歉,它不起作用,catch 块仍然没有被调用
  • 如果我将 RAISERROR('d', 16, 3) 放在 TRY 块中,它工作正常,但如果我把 SELECT 3 / 0;这没用。真的很奇怪,因为 3/0 也会抛出错误,对吧?
  • 哪里有异常,哪里就有一个 THROW。不是 RAISERROR
【解决方案2】:

您需要 SQL 中的 try-catch 吗?如果您只使用它来回滚事务,那么您可以简单地将 XACT_ABORT 设置为 ON 并省去 try-catch。事务将被回滚,任何错误都会冒泡到客户端。这是一篇关于这个主题的好文章:https://www.simple-talk.com/sql/t-sql-programming/defensive-error-handling/

【讨论】:

    【解决方案3】:

    看不到你所有的c#代码,只能替换; 捕获(异常 e) 和 捕获(SqlException e)

    【讨论】:

    • 一个异常会捕获所有异常,包括SqlException
    • ExceptionSqlException 的基类。如果抛出任何异常,catch(Exception) 会捕获它。不是我的反对
    猜你喜欢
    • 2022-01-09
    • 2017-03-10
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2018-05-19
    相关资源
    最近更新 更多