最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C#編程中異常的創(chuàng)建和引發(fā)以及異常處理

 更新時(shí)間:2016年02月01日 15:10:41   投稿:goldensun  
這篇文章主要介紹了C#編程中異常的創(chuàng)建和引發(fā)以及異常處理,文中介紹了Catch塊和Finally塊等基本的異常處理要點(diǎn),需要的朋友可以參考下

創(chuàng)建和引發(fā)異常
異常用于指示在運(yùn)行程序時(shí)發(fā)生了錯(cuò)誤。此時(shí)將創(chuàng)建一個(gè)描述錯(cuò)誤的異常對象,然后使用 throw 關(guān)鍵字“引發(fā)”該對象。然后運(yùn)行時(shí)搜索最兼容的異常處理程序。
當(dāng)存在下列一種或多種情況時(shí),程序員應(yīng)引發(fā)異常:
方法無法完成其中定義的功能。
例如,如果方法的參數(shù)具有無效值:

static void CopyObject(SampleClass original)
{
  if (original == null)
  {
    throw new System.ArgumentException("Parameter cannot be null", "original");
  }

}

根據(jù)對象的狀態(tài),對某個(gè)對象進(jìn)行不適當(dāng)?shù)恼{(diào)用。
一個(gè)示例可能嘗試對只讀文件執(zhí)行寫操作。在對象狀態(tài)不允許某項(xiàng)操作的情況下,引發(fā) InvalidOperationException 的一個(gè)實(shí)例或基于此類的派生類的對象。以下為引發(fā) InvalidOperationException 對象的方法的示例:

class ProgramLog
{
  System.IO.FileStream logFile = null;
  void OpenLog(System.IO.FileInfo fileName, System.IO.FileMode mode) {}

  void WriteLog()
  {
    if (!this.logFile.CanWrite)
    {
      throw new System.InvalidOperationException("Logfile cannot be read-only");
    }
    // Else write data to the log and return.
  }
}

方法的參數(shù)導(dǎo)致了異常。
在此情況下,應(yīng)捕獲原始異常并創(chuàng)建一個(gè) ArgumentException 實(shí)例。原始異常應(yīng)作為 InnerException 參數(shù)傳遞給 ArgumentException 的構(gòu)造函數(shù):

static int GetValueFromArray(int[] array, int index)
{
  try
  {
    return array[index];
  }
  catch (System.IndexOutOfRangeException ex)
  {
    System.ArgumentException argEx = new System.ArgumentException("Index is out of range", "index", ex);
    throw argEx;
  }
}

異常包含一個(gè)名為 StackTrace 的屬性。此字符串包含當(dāng)前調(diào)用堆棧上的方法的名稱,以及為每個(gè)方法引發(fā)異常的位置(文件名和行號)。 StackTrace 對象由公共語言運(yùn)行時(shí) (CLR) 從 throw 語句點(diǎn)開始自動創(chuàng)建,因此必須從堆棧跟蹤的開始點(diǎn)引發(fā)異常。
所有異常都包含一個(gè)名為 Message 的屬性。應(yīng)該設(shè)置此字符串來解釋發(fā)生異常的原因。注意,不應(yīng)將安全敏感信息放在消息文本中。除 Message 之外,ArgumentException 還包含一個(gè)名為 ParamName 的屬性,應(yīng)將該屬性設(shè)置為導(dǎo)致引發(fā)異常的參數(shù)的名稱。對于屬性設(shè)置器,ParamName 應(yīng)設(shè)置為 value。
公共的受保護(hù)方法應(yīng)在其無法完成預(yù)期功能時(shí)引發(fā)異常。引發(fā)的異常類應(yīng)該是符合錯(cuò)誤條件的最確切的可用異常。這些異常應(yīng)編寫為類功能的一部分,派生類或?qū)υ碱惖母聭?yīng)保留相同的行為,以實(shí)現(xiàn)向后兼容性。
引發(fā)異常時(shí)要避免的情況
下表確定了在引發(fā)異常時(shí)要避免的做法:

  • 不應(yīng)使用異常來更改正常執(zhí)行過程中的程序流程。異常只能用于報(bào)告和處理錯(cuò)誤條件。
  • 只能引發(fā)異常,而不能作為返回值或參數(shù)返回異常。
  • 不要從自己的源代碼中有意引發(fā) System.Exception、System.SystemException、System.NullReferenceException 或 System.IndexOutOfRangeException。
  • 不要?jiǎng)?chuàng)建可在調(diào)試模式下引發(fā)但不會在發(fā)布模式下引發(fā)的異常。若要在開發(fā)階段確定運(yùn)行時(shí)錯(cuò)誤,請改用調(diào)試斷言。

定義異常類

程序可以引發(fā) System 命名空間中的預(yù)定義異常類(前面注明的情況除外),或通過從 Exception 派生來創(chuàng)建它們自己的異常類。派生類至少應(yīng)定義四個(gè)構(gòu)造函數(shù):一個(gè)是默認(rèn)構(gòu)造函數(shù),一個(gè)用來設(shè)置消息屬性,一個(gè)用來設(shè)置 Message 屬性和 InnerException 屬性。第四個(gè)構(gòu)造函數(shù)用于序列化異常。新異常類應(yīng)該可序列化。例如:

public class InvalidDepartmentException : System.Exception
{
  public InvalidDepartmentException() : base() { }
  public InvalidDepartmentException(string message) : base(message) { }
  public InvalidDepartmentException(string message, System.Exception inner) : base(message, inner) { }

  // A constructor is needed for serialization when an
  // exception propagates from a remoting server to the client. 
  protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo info,
    System.Runtime.Serialization.StreamingContext context) { }
}

僅當(dāng)新屬性提供的數(shù)據(jù)有助于解決異常時(shí),才應(yīng)將其添加到異常類。如果向派生的異常類添加了新屬性,則應(yīng)重寫 ToString() 以返回添加的信息。


異常處理
C# 程序員可使用 try 塊對可能受異常影響的代碼進(jìn)行分區(qū)。關(guān)聯(lián)的 catch 塊用于處理任何結(jié)果異常。一個(gè)包含代碼的 finally 塊,無論 try 塊中是否引發(fā)異常(例如,釋放在 try 塊中分配的資源),這些代碼都會運(yùn)行。一個(gè) try 塊需要一個(gè)或多個(gè)關(guān)聯(lián)的 catch 塊或一個(gè) finally 塊,或兩者。
以下示例給出了一個(gè) try-catch 語句,一個(gè) try-finally 語句,和一個(gè) try-catch-finally 語句。

 try
{
  // Code to try goes here.
}
catch (SomeSpecificException ex)
{
  // Code to handle the exception goes here.
  // Only catch exceptions that you know how to handle.
  // Never catch base class System.Exception without
  // rethrowing it at the end of the catch block.
}

 try
{
  // Code to try goes here.
}
finally
{
  // Code to execute after the try block goes here.
}

 try
{
  // Code to try goes here.
}
catch (SomeSpecificException ex)
{
  // Code to handle the exception goes here.
}
finally
{
  // Code to execute after the try (and possibly catch) blocks 
  // goes here.
}

不帶有 catch 或 finally 塊的 try 塊將導(dǎo)致編譯器錯(cuò)誤。
Catch 塊
catch 塊可以指定要捕捉的異常的該類型。類型規(guī)范稱為“異常篩選器”。異常類型應(yīng)從 Exception 派生出來。一般而言,不會將 Exception 指定為異常篩選器,除非您了解如何處理 try 塊中可能引發(fā)的所有異常,或者您在 catch 塊中包括了 throw 語句。
具有不同異常篩選器的多個(gè) catch 塊可以串聯(lián)在一起。多個(gè) catch 數(shù)據(jù)塊的計(jì)算順序是在代碼中從頂部到底部,但是,對于所引發(fā)的每個(gè)異常,都只執(zhí)行一個(gè) catch 數(shù)據(jù)塊。與指定的準(zhǔn)確類型或其基類最為匹配的第一個(gè) catch 塊被執(zhí)行。如果 catch 塊沒有指定匹配異常篩選器,則 catch 塊就不具有選定的篩選器(如果語句有的話)。需要將帶有最具體的(即派生程度最高的)異常類的 catch 塊放在最前面。
當(dāng)下列條件為真時(shí),應(yīng)該捕捉異常:
對引發(fā)異常的原因有具體的了解,并可實(shí)現(xiàn)特定的恢復(fù),例如,在捕獲 FileNotFoundException 對象時(shí)提示用戶輸入新的文件名。
可以新建一個(gè)更具體的異常并引發(fā)該異常。

int GetInt(int[] array, int index)
{
  try
  {
    return array[index];
  }
  catch(System.IndexOutOfRangeException e)
  {
    throw new System.ArgumentOutOfRangeException(
      "Parameter index is out of range.");
  }
}

希望在將異常傳遞出去進(jìn)行額外處理前部分地處理異常。在下面的示例中,catch 塊用于在再次引發(fā)異常之前,向錯(cuò)誤日志添加條目。

try
{
  // Try to access a resource.
}
catch (System.UnauthorizedAccessException e)
{
  // Call a custom error logging procedure.
  LogError(e);
  // Re-throw the error.
  throw;   
}

Finally 塊
可以使用 finally 塊清理在 try 塊中執(zhí)行的操作。如果存在,finally 塊將在最后執(zhí)行,在 try 塊和任何匹配 catch 的塊之后執(zhí)行。不管是否引發(fā)異?;蛘呤欠裾业脚c異常類型匹配的 catch 塊,finally 始終運(yùn)行。
可以使用 finally 塊釋放資源(如文件流、數(shù)據(jù)庫連接和圖形句柄),而不用等待由運(yùn)行時(shí)中的垃圾回收器來完成對象。

在下面的示例中,使用 finally 塊關(guān)閉在 try 塊中打開的文件。注意,在關(guān)閉文件之前要檢查該文件句柄的狀態(tài)。如果 try 塊無法打開文件,則文件句柄仍具有值 null,并且 finally 塊不會嘗試關(guān)閉它?;蛘?,如果在 try 塊中成功打開該文件,則 finally 塊將關(guān)閉打開的文件。

System.IO.FileStream file = null;
System.IO.FileInfo fileinfo = new System.IO.FileInfo("C:\\file.txt");
try
{
  file = fileinfo.OpenWrite();
  file.WriteByte(0xF);
}
finally
{
  // Check for null because OpenWrite might have failed.
  if (file != null)
  {
    file.Close();
  }
}

相關(guān)文章

  • C#打印Word文檔的4種方法

    C#打印Word文檔的4種方法

    Word文檔是日常辦公和學(xué)習(xí)中不可或缺的一部分,這篇文章將提供以下4種通過C# 打印Word文檔的方法,以適應(yīng)不同的場景需求,需要的小伙伴可以了解下
    2025-02-02
  • C#使用HttpClient進(jìn)行Post請求出現(xiàn)超時(shí)問題的解決及優(yōu)化

    C#使用HttpClient進(jìn)行Post請求出現(xiàn)超時(shí)問題的解決及優(yōu)化

    最近我的控制臺程序發(fā)現(xiàn)有時(shí)候總是出現(xiàn)請求超時(shí)等問題,通常好幾分鐘最多只有3-4個(gè)請求,在使用apipost發(fā)現(xiàn)并發(fā)10個(gè)5分鐘也沒有問題,那么問題就出在我的請求端了,所以本文給大家介紹了C# 使用HttpClient進(jìn)行Post請求總是出現(xiàn)超時(shí)問題的優(yōu)化,需要的朋友可以參考下
    2025-01-01
  • C#編程實(shí)現(xiàn)取整和取余的方法

    C#編程實(shí)現(xiàn)取整和取余的方法

    這篇文章主要介紹了C#編程實(shí)現(xiàn)取整和取余的方法,結(jié)合實(shí)例形式分析了C#中Math.Celling與Math.Floor函數(shù)的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • 積累Visual Studio 常用快捷鍵的動畫演示

    積累Visual Studio 常用快捷鍵的動畫演示

    在代碼開發(fā)過程中,頻繁的使用鍵盤、鼠標(biāo)操作非常麻煩,影響程序的開發(fā)效率。如何操作能用鍵盤來操作,那就節(jié)省時(shí)間了。下面小編把我平時(shí)積累的有關(guān)visul studio 常用快捷鍵的動畫演示分享給大家,僅供大家參考
    2015-10-10
  • C#中struct和class的區(qū)別詳解

    C#中struct和class的區(qū)別詳解

    這篇文章主要介紹了C#中struct和class的區(qū)別,對C#初學(xué)者來說是需要牢固掌握的,需要的朋友可以參考下
    2014-08-08
  • C#創(chuàng)建安全的字典(Dictionary)存儲結(jié)構(gòu)

    C#創(chuàng)建安全的字典(Dictionary)存儲結(jié)構(gòu)

    本文主要對存儲結(jié)構(gòu)字典(Dictionary)的一些常用方法進(jìn)行簡單的說明,并闡述了如何創(chuàng)建安全的字典(Dictionary)存儲結(jié)構(gòu)。希望對大家有所幫助
    2016-12-12
  • C#調(diào)用海康工業(yè)相機(jī)SDK采集圖像并在Halcon窗口中顯示方式

    C#調(diào)用??倒I(yè)相機(jī)SDK采集圖像并在Halcon窗口中顯示方式

    這篇文章主要介紹了C#調(diào)用??倒I(yè)相機(jī)SDK采集圖像并在Halcon窗口中顯示方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#圖表算法之最短路徑

    C#圖表算法之最短路徑

    本文詳細(xì)講解了C#圖表算法之最短路徑,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C# 列表List的常用屬性和方法介紹

    C# 列表List的常用屬性和方法介紹

    這篇文章主要介紹了C# 列表List的常用屬性和方法介紹,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效

    Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02

最新評論

抚州市| 千阳县| 咸丰县| 石楼县| 合肥市| 漠河县| 开平市| 无为县| 东丽区| 香港| 庆阳市| 丰都县| 蒙山县| 同心县| 工布江达县| 安化县| 清镇市| 赣州市| 东乌珠穆沁旗| 武宁县| 南京市| 图木舒克市| 江都市| 临海市| 资兴市| 齐河县| 花垣县| 时尚| 林芝县| 永吉县| 苍山县| 卓资县| 九江市| 昌平区| 砀山县| 炎陵县| 搜索| 岳阳市| 称多县| 湾仔区| 平顺县|