SQL——trycatch定义解析处理sql错误处理
Try…Catch的定义
为了理解Try…Catch块,你必须先明⽩异常处理的概念。异常处理⾮常简单:在执⾏你的代码时,那些⾮计划之内发⽣的事情就是异常,你需要做⼀些事情对它进⾏处理。⾄于如何处理异常,则由开发⼈员,也就是你来决定。
为了是你的T-SQL代码可以处理异常,你就需要使⽤Try…Catch块。如果你使⽤过Visual Studio,那么你可能对Try…Catch块的概念很熟悉。T-SQL中的Try…Catch块虽然与完全成熟的Visual Studio中的很相似,但实际上它少了⼀些选项。在使⽤Try…Catch块时,将你所编写的需要运⾏的T-SQL代码放⼊Try块中。如果在运⾏这段代码时,如果⼀个严重级别是10级或者更⾼的错误发⽣,就会转到Catch块中运⾏那⾥⾯的异常处理代码。它的基本结构如下所⽰:
BEGIN TRY
[T-SQL代码写在这⾥]
END TRY
BEGIN CATCH
[异常处理代码写在这⾥]
END CATCH
在T-SQL中使⽤Try…Catch块时,你需要注意以下这些关键问题:
Try块后⾯必须要直接接⼀个Catch块,否则就会发⽣⼀个错误。
Try…Catch不能嵌套。
如果Try块中的代码没有故障,将跳过Catch块,执⾏Catch块后的第⼀条语句。
当Catch块中的代码运⾏完毕后,将执⾏Catch块后的第⼀条语句。
处理错误
当⼀个错误发⽣后,你作为⼀名开发者需要决定如何处理它。因为你不能像.Net语⾔那样,将控制权重新转回引起错误的代码上,你所能做的可能就是将问题记⼊⽇志,并将所执⾏的事务进⾏回滚。为了帮助记录,有⼀些系统函数提供了错误的更全⾯的信息,这些函数的具体内容如下所⽰:
ERROR_NUMBER() – 返回错误号。
ERROR_SEVERITY() – 返回错误严重级别。
ERROR_STATE() – 返回错误状态。
ERROR_PROCEDURE() - 返回错误所在的存储过程或触发器的名称。
ERROR_LINE() - 返回错误所在⾏的⾏号。
ERROR_MESSAGE() - 返回错误的实际信息。server error啥意思
使⽤这些函数,你可以记录错误的详细信息,并将这些信息返回给调⽤它的过程或者记录,以便对错误进⾏追踪和修复。这些函数只能在Catch块被调⽤,在其它地⽅使⽤会返回NULL。然⽽,这些函数可以被Catch块中的代码所使⽤。也就是说,你可以调⽤⼀个存储过程来处理错误,于是这个存储过程就可以调⽤这些错误函数。下⾯就是这样的存储过程的⼀个⽰例:
CREATE PROCEDURE spLogError
AS
--给应⽤程序返回错误的详细信息
SELECT
ERROR_NUMBER() AS ErrNum,
ERROR_SEVERITY() AS ErrSev,
ERROR_STATE() as ErrState,
ERROR_PROCEDURE() as ErrProc,
ERROR_LINE() as ErrLine,
ERROR_MESSAGE() as ErrMsg
--将错误记⼊错误数据库⽇志
INSERT INTO SQLErrors.dbo.ErrorLog
VALUES(ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(),
ERROR_PROCEDURE(), ERROR_LINE(),ERROR_MESSAGE())
这个过程可以在你的Catch块中被调⽤,⽤来返回和记录错误的详细信息。
BEGIN TRY
--在这⾥插⼊代码:当错误发⽣时,控制权将被转到Catch块
END TRY
BEGIN CATCH
--这个过程将会记录错误并将详细信息返回给调⽤它的应⽤程序
EXEC spLogError
END CATCH
使⽤XACT_STATE()函数
还有⼀个错误函数我们在前⾯没有讨论,那就是XACT_STATE()函数。它可以在你的Catch块中被调⽤,返回你的过程中事务的准确状态。XACT_STATE()函数的返回值及其意义如下所⽰:
1 : 有⼀个活动的事务,它可以被提交或者回滚。
0 : 没有活动的事务。
-1 : 有⼀个活动的事务,但由于有错误发⽣,事务不能被提交。
基于这些返回值,你就可以处理你的⾷物。如果返回值是1,你可以正常的提交或者回滚。如果返回值是0,则并没有打开的事务,如果尝试提交将会产⽣⼀个错误。返回值-1⽐较特殊,它意味着有⼀个事物,但是它不能被提交。如果返回值是-1的话,你也不能回滚到⼀个保存点,⽽只能将整个事务进⾏回滚。
错误和异常处理对于所有好的编程规范都是⾄关重要的。现在使⽤SQL Server 2005提供的Try…Catch块,你可以实现更好的错误处理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论