欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

解析Exception和C#處理Exception的常用方法總結(jié)

   在.NET中,異常是指成員沒有完成它的名稱宣稱可以完成的行動。在異常的機制中,異常和某件事情的發(fā)生頻率無關(guān)。

創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、銅仁網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計商城網(wǎng)站定制開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為銅仁等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

    異常處理四要素包括:一個表示異常詳細信息的類類型;一個向調(diào)用者引發(fā)異常類實例的成員;調(diào)用者的一段調(diào)用異常成員的代碼塊;調(diào)用者的一段處理將要發(fā)生異常的代碼塊。異常類類型包括:基類:System.Exception;系統(tǒng)級異常:System.SystemException;應(yīng)用程序級異常:System.ApplicationException。

   (一).在.NET中有如下的異常類:

     (1).由System.SystemException派生的異常類型:

System.AccessViolationException在試圖讀寫受保護內(nèi)存時引發(fā)的異常。
System.ArgumentException在向方法提供的其中一個參數(shù)無效時引發(fā)的異常。
System.Collections.Generic.KeyNotFoundException指定用于訪問集合中元素的鍵與集合中的任何鍵都不匹配時所引發(fā)的異常。
System.IndexOutOfRangeException訪問數(shù)組時,因元素索引超出數(shù)組邊界而引發(fā)的異常。
System.InvalidCastException因無效類型轉(zhuǎn)換或顯示轉(zhuǎn)換引發(fā)的異常。
System.InvalidOperationException當方法調(diào)用對于對象的當前狀態(tài)無效時引發(fā)的異常。
System.InvalidProgramException當程序包含無效Microsoft中間語言(MSIL)或元數(shù)據(jù)時引發(fā)的異常,這通常表示生成程序的編譯器中有bug。
System.IO.IOException發(fā)生I/O錯誤時引發(fā)的異常。
System.NotImplementedException在無法實現(xiàn)請求的方法或操作時引發(fā)的異常。
System.NullReferenceException嘗試對空對象引用進行操作時引發(fā)的異常。
System.OutOfMemoryException沒有足夠的內(nèi)存繼續(xù)執(zhí)行程序時引發(fā)的異常。
System.StackOverflowException掛起的方法調(diào)用過多而導致執(zhí)行堆棧溢出時引發(fā)的異常。

    (2).由System.ArgumentException派生的異常類型:

System.ArgumentNullException當將空引用傳遞給不接受它作為有效參數(shù)的方法時引發(fā)的異常。
System.ArgumentOutOfRangeException當參數(shù)值超出調(diào)用的方法所定義的允許取值范圍時引發(fā)的異常。

   (3).由System.ArithmeticException派生的異常類型:

System.DivideByZeroException試圖用零除整數(shù)值或十進制數(shù)值時引發(fā)的異常。
System.NotFiniteNumberException當浮點值為正無窮大、負無窮大或非數(shù)字(NaN)時引發(fā)的異常。
System.OverflowException在選中的上下文中所進行的算數(shù)運算、類型轉(zhuǎn)換或轉(zhuǎn)換操作導致溢出時引發(fā)的異常。

   (4).由System.IOException派生的異常類型:

System.IO.DirectoryNotFoundException當找不到文件或目錄的一部分時所引發(fā)的異常。
System.IO.DriveNotFoundException當嘗試訪問的驅(qū)動器或共享不可用時引發(fā)的異常。
System.IO.EndOfStreamException讀操作試圖超出流的末尾時引發(fā)的異常。
System.IO.FileLoadException當找到托管程序卻不能加載它時引發(fā)的異常。
System.IO.FileNotFoundException試圖訪問磁盤上不存在的文件失敗時引發(fā)的異常。
System.IO.PathTooLongException當路徑名或文件名超過系統(tǒng)定義的最大長度時引發(fā)的異常。

   (5).其他常用異常類型:     

ArrayTypeMismatchException試圖在數(shù)組中存儲錯誤類型的對象。
BadImageFormatException圖形的格式錯誤。
DivideByZeroException除零異常。
DllNotFoundException找不到引用的dll。
FormatException參數(shù)格式錯誤。
MethodAccessException試圖訪問私有或者受保護的方法。
MissingMemberException訪問一個無效版本的dll。
NotSupportedException調(diào)用的方法在類中沒有實現(xiàn)。
PlatformNotSupportedException平臺不支持某個特定屬性時拋出該錯誤。

(二)..NET的異常處理方式:

      發(fā)生異常時,系統(tǒng)將搜索可以處理該異常的最近的 catch 子句(根據(jù)該異常的運行時類型來確定)。首先,搜索當前的方法以查找一個詞法上包含著它的 try 語句,并按順序考察與該 try 語句相關(guān)聯(lián)的各個 catch 子句。如果上述操作失敗,則在調(diào)用了當前方法的方法中,搜索在詞法上包含著當前方法調(diào)用代碼位置的 try 語句。此搜索將一直進行下去,直到找到可以處理當前異常的 catch 子句(該子句指定一個異常類,它與當前引發(fā)該異常的運行時類型屬于同一個類或是該運行時類型所屬類的一個基類)。注意,沒有指定異常類的 catch 子句可以處理任何異常。

   找到匹配的 catch 子句后,系統(tǒng)將把控制轉(zhuǎn)移到該 catch 子句的第一條語句。在 catch 子句的執(zhí)行開始前,系統(tǒng)將首先按順序執(zhí)行嵌套在捕捉到該異常的 try 語句里面的所有 try 語句所對應(yīng)的全部 finally 子句。

      (1).try塊:包含的代碼通常需要執(zhí)行一些通用的資源清理操作,或者需要從異常中恢復,或者兩者都需要。try塊還可以包含也許會拋出異常的代碼。

      (2).catch塊:包含的是響應(yīng)一個異常需要執(zhí)行的代碼。如果沒有任何捕捉類型與拋出的異常匹配,CLR會去調(diào)用棧的更高一層搜索一個與異常匹配的捕捉類型。

      (3).finally塊:包含的代碼是保證會執(zhí)行的代碼。finally塊所有代碼執(zhí)行完畢后,線程退出finally塊,執(zhí)行緊跟在finally塊之后的語句。

(三).Exception的常用屬性的源碼解析:

     (1).Message:包含輔助性文字說明,指出拋出異常的原因。

public virtual String Message {
               get {
                if (_message == null) {
                    if (_className==null) { 
                        _className = GetClassName();
                    } 
                    return Environment.GetRuntimeResourceString("Exception_WasThrown", _className); 

                } else { 
                    return _message;
                }
            }
        }

(2).Data:對一個“鍵/值對”集合的引用。

public virtual IDictionary Data { 
            [System.Security.SecuritySafeCritical]  // auto-generated 
            get {
                if (_data == null) 
                    if (IsImmutableAgileException(this))
                        _data = new EmptyReadOnlyDictionaryInternal();
                    else
                        _data = new ListDictionaryInternal(); 

                return _data; 
            } 
        }

(3).Source:包含生成異常的程序集名稱。

public virtual String Source {
            #if FEATURE_CORECLR 
            [System.Security.SecurityCritical] // auto-generated
            #endif 
            get { 
                if (_source == null)
                { 
                    StackTrace st = new StackTrace(this,true);
                    if (st.FrameCount>0)
                    {
                        StackFrame sf = st.GetFrame(0); 
                        MethodBase method = sf.GetMethod();
 
                        Module module = method.Module; 

                        RuntimeModule rtModule = module as RuntimeModule; 

                        if (rtModule == null)
                        {
                            System.Reflection.Emit.ModuleBuilder moduleBuilder = module as System.Reflection.Emit.ModuleBuilder; 
                            if (moduleBuilder != null)
                                rtModule = moduleBuilder.InternalModule; 
                            else 
                                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeReflectionObject"));
                        } 

                        _source = rtModule.GetRuntimeAssembly().GetSimpleName();
                    }
                } 

                return _source; 
            } 
            #if FEATURE_CORECLR
            [System.Security.SecurityCritical] // auto-generated 
            #endif
            set { _source = value; }
        }

 (四).異常處理的常用方法:

    (1).提取異常及其內(nèi)部異常堆棧跟蹤

/// <summary>
        /// 提取異常及其內(nèi)部異常堆棧跟蹤
        /// </summary>
        /// <param name="exception">提取的例外</param>
        /// <param name="lastStackTrace">最后提取的堆棧跟蹤(對于遞歸), String.Empty or null</param>
        /// <param name="exCount">提取的堆棧數(shù)(對于遞歸)</param>
        /// <returns>Syste.String</returns>
        public static string ExtractAllStackTrace(this Exception exception, string lastStackTrace = null, int exCount = 1)
        {
            var ex = exception;
            const string entryFormat = "#{0}: {1}\r\n{2}";
            //修復最后一個堆棧跟蹤參數(shù)
            lastStackTrace = lastStackTrace ?? string.Empty;
            //添加異常的堆棧跟蹤
            lastStackTrace += string.Format(entryFormat, exCount, ex.Message, ex.StackTrace);
            if (exception.Data.Count > 0)
            {
                lastStackTrace += "\r\n    Data: ";
                foreach (var item in exception.Data)
                {
                    var entry = (DictionaryEntry)item;
                    lastStackTrace += string.Format("\r\n\t{0}: {1}", entry.Key, exception.Data[entry.Key]);
                }
            }
            //遞歸添加內(nèi)部異常
            if ((ex = ex.InnerException) != null)
                return ex.ExtractAllStackTrace(string.Format("{0}\r\n\r\n", lastStackTrace), ++exCount);
            return lastStackTrace;
        }

(2).異常處理常用方法:

/// <summary>
        /// 檢查字符串是空的或空的,并拋出一個異常
        /// </summary>
        /// <param name="val">值測試</param>
        /// <param name="paramName">參數(shù)檢查名稱</param>
        public static void CheckNullOrEmpty(string val, string paramName)
        {
            if (string.IsNullOrEmpty(val))
                throw new ArgumentNullException(paramName, "Value can't be null or empty");
        }
        
         /// <summary>
        /// 請檢查參數(shù)1不同于參數(shù)2
        /// </summary>
        /// <param name="param1">值1測試</param>
        /// <param name="param1Name">name of value 1</param>
        /// <param name="param2">value 2 to test</param>
        /// <param name="param2Name">name of vlaue 2</param>
        public static void CheckDifferentsParams(object param1, string param1Name, object param2, string param2Name)
        {
            if (param1 == param2) {
                throw new ArgumentException(param1Name + " can't be the same as " + param2Name,
                    param1Name + " and " + param2Name);
            }
        }

        /// <summary>
        /// 檢查一個整數(shù)值是正的(0或更大)
        /// </summary>
        /// <param name="val">整數(shù)測試</param>
        public static void PositiveValue(int val)
        {
            if (val < 0)
                throw new ArgumentException("The value must be greater than or equal to 0.");
        }

  異常處理器(程序):對于程序中出現(xiàn)的異常,在C#中是使用一種被稱為“異常處理器(程序)”的錯誤捕獲機制來進行處理的, 你可以認為異常處理器(程序)就是發(fā)生錯誤時,能夠接受并處理錯誤的接受者和處理。

網(wǎng)頁題目:解析Exception和C#處理Exception的常用方法總結(jié)
URL分享:http://chinadenli.net/article10/gojodo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站全網(wǎng)營銷推廣外貿(mào)網(wǎng)站建設(shè)Google網(wǎng)頁設(shè)計公司App設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)