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