2009-05-06 11 views
0

全部。我在嘗試{}塊後保留了以下片段。它的目的是提供調試信息,無論何時配置回數據庫...它很好地調試(不是所有它應該調試,但足以找到確切的錯誤,但是..在C#中調試db相關方法的更好的錯誤處理程序代碼?

代碼聞起來,即使我。能得到它你有錯誤處理的數據庫方法更好的主意

這裏(我在上log4net的實施目前的工作)是代碼:

區域CatchExceptionsAdv5NoReturnAtAll

catch (NullReferenceException nre) 
    { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 

     System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); 
     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += nre.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

    } //eof catch 

    catch (System.InvalidOperationException ioe) //comm -- occurs when no result set was found !!! 
    { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 

     System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); 
     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += ioe.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

    } //eof catch (System.InvalidOperationException) 

    catch (System.IndexOutOfRangeException ioore) //comm -- occurs when no result set was found !!! 
    { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 

     System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); 
     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += ioore.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

    } //eof catch (System.IndexOutOfRangeException) 

    catch (System.Data.SqlClient.SqlException sqle) 
    { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 

     System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); 
     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += sqle.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

    } //eof catch 

    catch (System.FormatException fe) 
    { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 

     System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); 
     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += fe.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

    } //eof catch 

    catch (Exception ex) 
    { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 

     System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); 
     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += ex.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

    } //eof catch 
    #endregion CatchExceptionsAdv5NoReturnAtAll 
+2

它看起來像代碼重複了很多。那將是我會考慮重構的第一件事。 – mjallday 2009-05-06 02:13:40

回答

2

你應該採取ook exception handling block in Enterprise Library。它可以讓你做很多你想做的事,而不用重複這麼大的代碼塊。但是,一般來說,爲什麼不將所有重複的代碼都排除在每個異常之外呢?至少,如果您不想使用EntLib,請將所有重複的代碼分解出來,並自己構建一個方法庫,您可以從異常處理塊中乾淨地調用以執行您想要執行的操作。

+0

像這樣的東西?! (ExceptionType et) StackTrace st = new StackTrace(); CallToExceptionHanlingMethod(st,userObj,et); 返回false; } – 2009-05-06 02:42:59

+0

是的,這將做到這一點。它將大幅清理代碼併爲您提供集中的位置來處理異常並進行日誌記錄。 – 2009-05-06 03:43:33

0

我quess真正的答案將使用企業庫是一方或log4net的...同時重構的快速和骯髒的方法是使用下面的調用來取代區域:

catch (Exception ex) 
    { 
    System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); 
    Utils.ErrorHandler.Trap (ref userObj, st, ex); 
    return false; 
    } //eof catch 

其指向錯誤Handler類呈現波紋管,這並不能改善錯誤報告既沒有提供錯誤報告更好的架構......到目前爲止,它只是刪除了重複代碼,提高可讀性:

using System; 

namespace Utils 
{ 
    public class ErrorHandler 
    { 


    public static void Trap (ref FB.User userObj, System.Diagnostics.StackTrace st, Exception ex) 
    { 
     if (userObj == null) 
     { 
     userObj = new FB.User(); 
     FB.User.GiveDefaultUser (ref userObj); 
     } 


     if (ex is NullReferenceException) 
     { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 


     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += ex.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

     } //eof if 

     if (ex is System.InvalidOperationException) //comm -- occurs when no result set was found !!! 
     { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 


     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += ex.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

     } //eof if 

     if (ex is System.IndexOutOfRangeException) //comm -- occurs when no result set was found !!! 
     { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 


     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += ex.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

     } //eof if 

     if (ex is System.Data.SqlClient.SqlException) 
     { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 


     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += ex.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

     } //eof if 

     if (ex is System.FormatException) 
     { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 


     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += ex.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

     } //eof if 

     if (ex is Exception) 
     { 
     if (userObj == null) 
     { 
      userObj = new FB.User(); 
      FB.User.GiveDefaultUser (ref userObj); 
     } 


     string methodName = st.GetFrame (1).GetMethod().Name; 
     string className = st.GetFrame (1).GetFileName(); 
     int lineNumber = st.GetFrame (1).GetFileLineNumber(); 

     string encryptedErrorCode = String.Empty; 
     encryptedErrorCode += "className - " + className + " methodName "; 
     encryptedErrorCode += methodName + " lineNumber " + lineNumber.ToString(); 
     encryptedErrorCode += userObj.DomainName; 

     if (System.Convert.ToInt16 (BL.Conf.Instance.Vars["EncryptErrorMessages"]) == 1) 
      encryptedErrorCode = Utils.DataEncryption.EncryptString (encryptedErrorCode, userObj.DomainName); 


     userObj.Mc.Msg = "An error in the application occurred. Report the following error code " + encryptedErrorCode; 
     userObj.Mc.ClassName += className + " ; "; 
     userObj.Mc.MethodName += methodName + " ; "; 
     userObj.Mc.DebugMsg += ex.Message; 
     // 
     if (Providers.nsDbMeta.DbDebugger.DebugAppError (ref userObj) == false) 
     { 
      userObj.Mc.Msg = "Failed to debug application error at " + methodName; 
      //Providers.nsDbMeta.Providers.nsDbMeta.DbDebugger.WriteIf (userObj.Mc.Msg); 
     } 

     } //eof catch 


    } //eof method 



    }//eof class CustomException 
} //eof namespace U 
相關問題