1

這是基本的編程問題,而不是特定的SQL Server問題。我想知道錯誤處理的基本原則是什麼?發生錯誤時,代碼是否總是會拋出異常?如果異常總是終止程序或批處理?錯誤處理的基本原則?

+0

您是否在談論與數據庫通信的錯誤?或者只是任何一種錯誤? – 2011-03-23 18:49:49

+0

在數據庫上下文 – juur 2011-03-23 18:53:35

回答

0

處理錯誤的方式通常取決於上下文。您可能會遇到某些錯誤。這種情況的一個例子可能像是違反密鑰的情況。在這種情況下,您可能只希望記錄該錯誤(可能會將其記錄爲信息而不是正確的錯誤),並向用戶界面返回用戶友好的消息,以通知用戶發生了問題。其他錯誤是意外的。這些應該很可能還會被記錄下來並向用戶報告,並有可能採取進一步的步驟以將異常追蹤發送給開發團隊(即通過電子郵件等)。

當今許多現代編程語言都具有結構化異常處理功能,這使得陷印和日誌記錄異常非常簡單。還有一些日誌框架來幫助記錄。 .Net領域的良好日誌記錄框架包括log4net,nLog和elmah。網絡上的所有這些日誌框架都應該有大量的例子。

就SQL Server而言,錯誤處理能力並不那麼先進。

處理錯誤在存儲過程中常見的模式會是這樣的

create procedure [dbo].[test_dosomework] 
(
    @param1 int, 
    @param2 varchar(10) 
) 
as 
begin 
    declare @errorCode int 

    select @errorCode = 0 

    insert table1 (aValue) 
    values (@param1) 

    select @errorCode = @@ERROR 

    if @errorCode = 0 
    begin 
    insert table1 (aValue2) 
    values (@param2) 

    select @errorCode = @@ERROR 
    end 
    return @errorCode 
end 

在這種情況下,如果發生錯誤,無論是在插入語句的@ERROR將返回錯誤編號,@errorCode會被設置爲這個錯誤號,並且存儲過程的返回值將是錯誤號的返回值。

0

如果您使用SQL 2005或2008,則應在每個語句後使用新的錯誤處理結構TRY/CATCH而不是檢查@@error。這是SQL 2000的做事方式,閱讀和管理起來要困難得多。

您不必像以前討論的那樣捕獲每個錯誤,因爲批次不會因某些錯誤而終止,但如果您想確保幾乎任何事情都中止事務,則應在您的開始時使用SET XACT_ABORT ON批量。

在線Erland Sommerskog查看任何涉及錯誤處理的內容。他是一位着名的SQL Server MVP,具有錯誤處理功能。

+0

中,我將不得不嘗試使用SQL Server 2008,但尚未在憤怒中使用任何新功能。 – Andrew 2011-03-23 20:03:35