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

雜談try-catch-finally異常處理

 更新時(shí)間:2016年01月13日 11:17:19   作者:至軟  
這篇文章主要介紹了雜談try-catch-finally異常處理的相關(guān)資料,需要的朋友可以參考下

相關(guān)閱讀:再談異常處理try catch finally

1. 前言

最近這段時(shí)間正開發(fā)一個(gè)店鋪管理系統(tǒng),這個(gè)項(xiàng)目定位于給中小型店鋪使用的軟件系統(tǒng)。簡(jiǎn)單的說,它處理商品的進(jìn)貨,銷售,退貨等功能。軟件雖小,五臟俱全,里面涉及的技術(shù)跟大型應(yīng)用軟件其實(shí)差別也不大,其中有加密、數(shù)據(jù)訪問、異常處理、日志、驗(yàn)證、ORM、依賴注入等。

本篇文章主要介紹C#語(yǔ)言的異常處理方面的內(nèi)容,其中包含的主要內(nèi)容:

•什么是異常?異常的特點(diǎn)?
•異常處理的基礎(chǔ)知識(shí)。
•引發(fā)和捕捉異常的處理準(zhǔn)則。
•避免與異常相關(guān)的性能問題的兩種設(shè)計(jì)模式。
•微軟企業(yè)庫(kù)異常處理模塊。

2. 異常概述

•在應(yīng)用程序遇到異常情況(如被零除情況或內(nèi)存不足警告)時(shí),就會(huì)產(chǎn)生異常。
•在可能引發(fā)異常的語(yǔ)句周圍使用 try 塊。
•try 塊中發(fā)生異常后,控制流會(huì)立即跳轉(zhuǎn)到關(guān)聯(lián)的異常處理程序(如果存在)。
•如果給定異常沒有異常處理程序,則程序?qū)⑼V箞?zhí)行,并顯示一條錯(cuò)誤消息。
•如果 catch 塊定義了一個(gè)異常變量,則可以使用它來獲取有關(guān)所發(fā)生異常的類型的更多信息。
•可能導(dǎo)致異常的操作通過 try 關(guān)鍵字來執(zhí)行。
•異常處理程序是在異常發(fā)生時(shí)執(zhí)行的代碼塊。在 C# 中,catch 關(guān)鍵字用于定義異常處理程序。
•程序可以使用 throw 關(guān)鍵字顯式地引發(fā)異常。
•異常對(duì)象包含有關(guān)錯(cuò)誤的詳細(xì)信息,比如調(diào)用堆棧的狀態(tài)以及有關(guān)錯(cuò)誤的文本說明。
•即使引發(fā)了異常,finally 塊中的代碼也會(huì)執(zhí)行,從而使程序可以釋放資源。

3. 異常處理基礎(chǔ)知識(shí)

3.1. 如何:使用 Try/Catch 塊捕捉異常

將可能引發(fā)異常的代碼節(jié)放在 Try 塊中,而將處理異常的代碼放在 Catch 塊中。Catch 塊是一系列以關(guān)鍵字 catch 開頭的語(yǔ)句,語(yǔ)句后跟異常類型和要執(zhí)行的操作。

下面的代碼示例使用 Try/Catch 塊捕捉可能的異常。Main 方法包含帶有 StreamReader 語(yǔ)句的 Try 塊,該語(yǔ)句打開名為 data.txt 的數(shù)據(jù)文件并從該文件寫入字符串。Try 塊后面是 Catch 塊,該塊捕捉 Try 塊產(chǎn)生的任何異常。

using System;
using System.IO;
using System.Security.Permissions;
// Security permission request.
[assembly:FileIOPermissionAttribute(SecurityAction.RequestMinimum, All = @"c:\data.txt")]
public class ProcessFile {
public static void Main() {
try {
StreamReader sr = File.OpenText("data.txt");
Console.WriteLine("The first line of this file is {0}", sr.ReadLine()); 
}
catch(Exception e) {
Console.WriteLine("An error occurred: '{0}'", e);
}
}
}

3.2. 如何:在 Catch 塊中使用特定異常

發(fā)生異常時(shí),異常沿堆棧向上傳遞,每個(gè) Catch 塊都有機(jī)會(huì)處理它。Catch 語(yǔ)句的順序很重要。將針對(duì)特定異常的 Catch 塊放在常規(guī)異常 Catch 塊的前面,否則編譯器可能會(huì)發(fā)出錯(cuò)誤。確定正確 Catch 塊的方法是將異常的類型與 Catch 塊中指定的異常名稱進(jìn)行匹配。如果沒有特定的 Catch 塊,則由可能存在的常規(guī) Catch 塊捕捉異常。

下面的代碼示例使用 try/catch 塊捕獲 InvalidCastException。該示例創(chuàng)建一個(gè)名為 Employee 的類,它帶有一個(gè)屬性:職員級(jí)別 (Emlevel)。PromoteEmployee 方法取得對(duì)象并增加職員級(jí)別。將 DateTime 實(shí)例傳遞給 PromoteEmployee 方法時(shí),發(fā)生 InvalidCastException。

using System;
public class Employee
{
//Create employee level property.
public int Emlevel
{
get
{
return(emlevel);
}
set
{
emlevel = value;
}
}
int emlevel;
}
public class Ex13
{
public static void PromoteEmployee(Object emp)
{
//Cast object to Employee.
Employee e = (Employee) emp;
// Increment employee level.
e.Emlevel = e.Emlevel + 1;
}
public static void Main()
{
try
{
Object o = new Employee();
DateTime newyears = new DateTime(2001, 1, 1);
//Promote the new employee.
PromoteEmployee(o);
//Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
PromoteEmployee(newyears);
}
catch (InvalidCastException e)
{
Console.WriteLine("Error passing data to PromoteEmployee method. " + e);
}
}
}

3.3. 如何:顯式引發(fā)異常

可以使用 throw 語(yǔ)句顯式引發(fā)異常。還可以使用 throw 語(yǔ)句再次引發(fā)捕獲的異常。較好的編碼做法是,向再次引發(fā)的異常添加信息以在調(diào)試時(shí)提供更多信息。

下面的代碼示例使用 try/catch 塊捕獲可能的 FileNotFoundException。try 塊后面是 catch 塊,catch 塊捕獲 FileNotFoundException,如果找不到數(shù)據(jù)文件,則向控制臺(tái)寫入消息。下一條語(yǔ)句是 throw 語(yǔ)句,該語(yǔ)句引發(fā)新的 FileNotFoundException 并向該異常添加文本信息。

using System;
using System.IO;
public class ProcessFile
{
public static void Main()
{
FileStream fs = null;
try 
{
//Opens a text tile.
fs = new FileStream(@"C:\temp\data.txt", FileMode.Open);
StreamReader sr = new StreamReader(fs);
string line;
//A value is read from the file and output to the console.
line = sr.ReadLine();
Console.WriteLine(line);
}
catch(FileNotFoundException e)
{
Console.WriteLine("[Data File Missing] {0}", e);
throw new FileNotFoundException(@"data.txt not in c:\temp directory]",e);
}
finally
{
if (fs != null)
fs.Close();
}
}
}

3.4. 如何:使用 Finally 塊

異常發(fā)生時(shí),執(zhí)行將終止,并且控制交給最近的異常處理程序。這通常意味著不執(zhí)行希望總是調(diào)用的代碼行。有些資源清理(如關(guān)閉文件)必須總是執(zhí)行,即使有異常發(fā)生。為實(shí)現(xiàn)這一點(diǎn),可以使用 Finally 塊。Finally 塊總是執(zhí)行,不論是否有異常發(fā)生。

下面的代碼示例使用 try/catch 塊捕獲 ArgumentOutOfRangeException。Main 方法創(chuàng)建兩個(gè)數(shù)組并試圖將一個(gè)數(shù)組復(fù)制到另一個(gè)數(shù)組。該操作生成 ArgumentOutOfRangeException,同時(shí)錯(cuò)誤被寫入控制臺(tái)。Finally 塊執(zhí)行,不論復(fù)制操作的結(jié)果如何。

using System;
class ArgumentOutOfRangeExample
{
static public void Main()
{
int[] array1={0,0};
int[] array2={0,0};
try
{
Array.Copy(array1,array2,-1);
}
catch (ArgumentOutOfRangeException e)
{
Console.WriteLine("Error: {0}",e);
}
finally
{
Console.WriteLine("This statement is always executed.");
}
}
}

4. 異常設(shè)計(jì)準(zhǔn)則

4.1. 異常引發(fā)

•不要返回錯(cuò)誤代碼。異常是報(bào)告框架中的錯(cuò)誤的主要手段。
•盡可能不對(duì)正??刂屏魇褂卯惓!3讼到y(tǒng)故障及可能導(dǎo)致爭(zhēng)用狀態(tài)的操作之外,框架設(shè)計(jì)人員還應(yīng)設(shè)計(jì)一些 API 以便用戶可以編寫不引發(fā)異常的代碼。例如,可以提供一種在調(diào)用成員之前檢查前提條件的方法,以便用戶可以編寫不引發(fā)異常的代碼。
•不要包含可以根據(jù)某一選項(xiàng)引發(fā)或不引發(fā)異常的公共成員。
•不要包含將異常作為返回值或輸出參數(shù)返回的公共成員。
•考慮使用異常生成器方法。從不同的位置引發(fā)同一異常會(huì)經(jīng)常發(fā)生。為了避免代碼膨脹,請(qǐng)使用幫助器方法創(chuàng)建異常并初始化其屬性。
•避免從 finally 塊中顯式引發(fā)異常。可以接受因調(diào)用引發(fā)異常的方法而隱式引發(fā)的異常。

4.2. 異常處理

•不要通過在框架代碼中捕捉非特定異常(如 System.Exception、System.SystemException 等)來處理錯(cuò)誤。
•避免通過在應(yīng)用程序代碼中捕捉非特定異常(如 System.Exception、System.SystemException 等)來處理錯(cuò)誤。某些情況下,可以在應(yīng)用程序中處理錯(cuò)誤,但這種情況極。
•如果捕捉異常是為了傳輸異常,則不要排除任何特殊異常。
•如果了解特定異常在給定上下文中引發(fā)的條件,請(qǐng)考慮捕捉這些異常。
•不要過多使用 catch。通常應(yīng)允許異常在調(diào)用堆棧中往上傳播。
•使用 try-finally 并避免將 try-catch 用于清理代碼。在書寫規(guī)范的異常代碼中,try-finally 遠(yuǎn)比 try-catch 更為常用。
•捕捉并再次引發(fā)異常時(shí),首選使用空引發(fā)。這是保留異常調(diào)用堆棧的最佳方式。
•不要使用無參數(shù) catch 塊來處理不符合 CLS 的異常(不是從 System.Exception 派生的異常)。支持不是從 Exception 派生的異常的語(yǔ)言可以處理這些不符合 CLS 的異常。

5. 兩種設(shè)計(jì)模式

5.1. Tester-Doer 模式

Doer 部分

public class Doer
{
public static void ProcessMessage(string message)
{
if (message == null)
{
throw new ArgumentNullException("message");
}
}
}

Tester部分

public class Tester
{
public static void TesterDoer(ICollection<string> messages)
{
foreach (string message in messages)
{
if (message != null)
{
Doer.ProcessMessage(message);
}
}
}
}

5.2. TryParse 模式

TryParse 方法類似于 Parse 方法,不同之處在于 TryParse 方法在轉(zhuǎn)換失敗時(shí)不引發(fā)異常。

Parse方法

public void Do()
{
string s = “a”;
double d;
try
{
d = Double.Parse(s);
}
catch (Exception ex)
{
d = 0;
}
}

TryParse方法

public void TryDo()
{
string s = "a";
double d;
if (double.TryParse(s, out d) == false)
{
d = 0;
}
}

6. 微軟企業(yè)庫(kù)異常處理模塊

6.1. 創(chuàng)建自定義異常包裝類

public class BusinessLayerException : ApplicationException
{
public BusinessLayerException() : base()
{
}
public BusinessLayerException(string message) : base(message)
{
}
public BusinessLayerException(string message, Exception exception) :
base(message, exception)
{
}
protected BusinessLayerException(SerializationInfo info, StreamingContext context) :
base(info, context)
{
}
}

6.2. 配置異常處理

<add name="Wrap Policy">
<exceptionTypes>
<add type="System.Data.DBConcurrencyException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="ThrowNewException" name="DBConcurrencyException">
<exceptionHandlers>
<add exceptionMessage="Wrapped Exception: A recoverable error occurred while attempting to access the database."
exceptionMessageResourceType="" wrapExceptionType="ExceptionHandlingQuickStart.BusinessLayer.BusinessLayerException, ExceptionHandlingQuickStart.BusinessLayer"
type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WrapHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
name="Wrap Handler" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>

6.3. 編寫代碼

public bool ProcessWithWrap()
{
try
{
this.ProcessB();
}
catch(Exception ex)
{
// Quick Start is configured so that the Wrap Policy will
// log the exception and then recommend a rethrow.
bool rethrow = ExceptionPolicy.HandleException(ex, "Wrap Policy");
if (rethrow)
{
throw; 
} 
}
return true;
}

小結(jié)

try { //執(zhí)行的代碼,其中可能有異常。一旦發(fā)現(xiàn)異常,則立即跳到catch執(zhí)行。否則不會(huì)執(zhí)行catch里面的內(nèi)容 }
catch { //除非try里面執(zhí)行代碼發(fā)生了異常,否則這里的代碼不會(huì)執(zhí)行 }
finally { //不管什么情況都會(huì)執(zhí)行,包括try catch 里面用了return ,可以理解為只要執(zhí)行了try或者catch,就一定會(huì)執(zhí)行 finally }

相關(guān)文章

  • C#基本打印事件用法實(shí)例

    C#基本打印事件用法實(shí)例

    這篇文章主要介紹了C#基本打印事件用法,實(shí)例分析了C#中print打印及DrawString文本字符串繪制等相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • C# 實(shí)現(xiàn)顏色的梯度漸變案例

    C# 實(shí)現(xiàn)顏色的梯度漸變案例

    這篇文章主要介紹了C# 實(shí)現(xiàn)顏色的梯度漸變案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 一個(gè)可攜帶附加消息的增強(qiáng)消息框MessageBoxEx

    一個(gè)可攜帶附加消息的增強(qiáng)消息框MessageBoxEx

    一個(gè)可攜帶附加消息的增強(qiáng)消息框MessageBoxEx分享給大家,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • C# 匿名方法基礎(chǔ)回顧

    C# 匿名方法基礎(chǔ)回顧

    本篇文章主要介紹了C#的匿名方法的參數(shù)使用范圍以及委托示例。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新聞效果的方法

    WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新聞效果的方法

    這篇文章主要介紹了WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新聞效果的方法,涉及WinForm窗口滾動(dòng)字幕設(shè)置的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#使用LINQ查詢表達(dá)式的基本子句總結(jié)

    C#使用LINQ查詢表達(dá)式的基本子句總結(jié)

    這篇文章主要介紹了C#使用LINQ查詢表達(dá)式的基本子句總結(jié),在C#程序中我們可以使用LINQ基本查詢表達(dá)式模式來查詢和轉(zhuǎn)換SQL數(shù)據(jù)庫(kù)、ADO.NET數(shù)據(jù)集、XML文檔和流以及.NET集合中的數(shù)據(jù),需要的朋友可以參考下
    2016-03-03
  • jQuery結(jié)合C#實(shí)現(xiàn)上傳文件的方法

    jQuery結(jié)合C#實(shí)現(xiàn)上傳文件的方法

    這篇文章主要介紹了jQuery結(jié)合C#實(shí)現(xiàn)上傳文件的方法,涉及C#文件上傳的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#在圖片增加文字的實(shí)現(xiàn)代碼

    C#在圖片增加文字的實(shí)現(xiàn)代碼

    最近做項(xiàng)目需要?jiǎng)討B(tài)給圖片增加文字(書本的封面圖片),修改字體大小、字體、顏色、控制位置等,下面通過實(shí)例代碼給大家分享C#在圖片增加文字的實(shí)現(xiàn)代碼,一起看看吧
    2017-06-06
  • 使用C#實(shí)現(xiàn)解析Excel公式

    使用C#實(shí)現(xiàn)解析Excel公式

    在日常工作中,我們經(jīng)常需要在Excel中使用公式對(duì)表中數(shù)據(jù)進(jìn)行計(jì)算和分析,所以本文小編主要來和大家介紹一下如何在C#中實(shí)現(xiàn)解析Excel公式,感興趣的可以了解下
    2024-02-02
  • C#備忘錄人生存檔的設(shè)計(jì)模式實(shí)例

    C#備忘錄人生存檔的設(shè)計(jì)模式實(shí)例

    這篇文章主要為大家介紹了C#設(shè)計(jì)模式中備忘錄模式的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論

承德县| 天峨县| 峨边| 绥阳县| 门头沟区| 兴国县| 赫章县| 宜兰县| 新沂市| 阳朔县| 诏安县| 文安县| 宜春市| 侯马市| 沅陵县| 旬邑县| 桂林市| 义马市| 西贡区| 建始县| 桐柏县| 布尔津县| 壶关县| 米泉市| 富川| 松滋市| 马龙县| 山东省| 锡林郭勒盟| 依安县| 梅州市| 禄丰县| 青州市| 灵山县| 陵水| 瑞安市| 花莲市| 博兴县| 曲阳县| 青神县| 尉犁县|