sql 尝试在 asp.net 中捕获


BEGIN TRY 
    INSERT INTO [something] ([something], [something])
        SELECT
            [ID] AS OrderNumber, [something], [something] 
        FROM 
            [something]
        WHERE 
            ID = @OrderNumber
END TRY
BEGIN CATCH 
    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;
END CATCH

我遇到了一些这样的异常,但我不知道如何在我的网页中显示该错误消息。如果我像这样离开它,即使我故意得到错误的数据,这段代码也会变得低谷。

如果存储过程中不需要异常处理,则不需要 try/catch。你可以让你的过程抛出它的错误。

在应用程序代码中,您可以捕获SqlException

try
    // whatever
catch sqlException as SqlException
    // Now you have access to the properties of the SqlException
end try

尽管我不会在网页上向用户显示任何详细信息。也许他们所需要的只是知道有一个错误。他们可能不想要或不需要更多。告诉用户比他们需要知道的更多内容甚至存在一定程度的安全风险。

也许您确实需要在SQL中使用try/catch,以便可以回滚事务。

在SQL Server 2012中,您可以执行此操作 - 只需重新抛出原始错误即可。

begin catch
    -- Roll back transaction if needed
    throw
end catch

在SQL Server 2012之前,你可以做这样的事情,这不太好。或者您可以设置一些输出参数。问题是您可以访问错误的详细信息,但无法重新引发原始错误。

begin catch
    declare 
        @error_number int = error_number(),
        @error_severity int = error_severity(),
        @error_state int = error_state(),
        @error_procedure varchar(255) = error_procedure(),
        @error_line int = error_line(),
        @error_message varchar(1000) = error_message()
        -- Roll back transaction if needed
        -- Raise an error with the information from the original error.
    RAISERROR (N'Error number %d, severity %d, state %d, procedure %s, line %d, message: %s', @error_severity, @error_state,-- Message text.  
      @error_number, @error_severity, @error_state, @error_procedure, @error_line, @error_message); -- Second argument.  
end catch

最好在 C# 中执行 TRY CATCH,而不是在过程中执行。如果你执行后者,你仍然需要处理返回值,这是更多的努力,没有好处,除非你需要从你的过程创建特定的返回值。

https://learn.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/try-catch

相关内容

  • 没有找到相关文章

最新更新