精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

.NET中異常處理的幾個誤區

開發 后端
很多人在使用.Net多年之后還是對異常處理一知半解的,有很多誤解。本文將講解三個常見誤解,一個是catch的使用方法是否正確,另外兩個是try/catch的性能損失問題。

有些人認為下面代碼就是一個catch的錯誤用法:

catch(Exception e)
{
    throw e;
}

首先說明,這不是一個錯誤用法,但是通常來講,我們應該避免這種代碼。然后要說明的是,這段代碼有一個比較典型的作用就是改變異常出現的位置,也就是可以對某類異常統一在一個位置處理。先看下面代碼:

public int GetAllCount2()
    {
        try
        {
            openDB();
            int i = 1;
            return i;
        }
        catch (SqlException sex)
        {
            throw sex;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    public int GetAllCount()
    {
        openDB(); // 這里也可能是微軟企業類庫等
        int i = 1;
        return i;
    }

    private void openDB()
    {
        conn.Open();
    }

假設我們有一個公用方法叫openDB(),而很多方法中調用它,當數據庫打開失敗的時候,對于調用GetAllCount方法,異常將定位于conn.Open而如果調用GetAllCount2,那么異常定位于throw sex的位置,同時堆棧信息也有所不同,可以更快捷的找到調用方法的位置,也可在此位置進行一些錯誤恢復處理。尤其是我們編寫一些底層類庫的時候,比如Framework類庫從不會把異常代碼定位到Framework類庫內部的某個方法上面。但是需要注意的是我們盡量避免捕獲異常而不返回,例如:

catch(){}

這樣的使用就是典型的錯誤使用了,因為對于Framework來講,任何時候系統都可能拋出一個StackOverflowException或者OutOfMemoryExcetpion而上面這段代碼則隱藏了這些異常,有時候則導致一些嚴重的問題。

#p#

對于異常處理,在性能上有2點注意

***點:在使用try/catch時,如果不發生異常,那么幾乎可以忽略性能的損失。

關于這一點,這里我們進行一些深入分析,對此比較了解的可以跳過本節。首先,讓我們先看一下try/catch的IL表現。我們有2個方法,一個使用try/catch,而另一個未做任何處理:

static int Test1(int a, int b)
{
    try
    {
        if (a > b)
            return a;
        return b;
    }
    catch
    {
        return -1;
    }
}

static int Test2(int a, int b)
{
    if (a > b)
        return a;
    return b;
}

使用ILDasm工具查看,IL代碼分別如下:(這里之所以引入IL,是因為IL是比較接近機器匯編,所以在IL中我們可以更清楚的了解代碼的執行情況,對IL沒有興趣的可以跳過此節)

.method private hidebysig static int32  Test1(int32 a,
                                              int32 b) cil managed
{
  // 代碼大小       30 (0x1e)
  .maxstack  2
  .locals init ([0] int32 CS$1$0000,
           [1] bool CS$4$0001)
  IL_0000:  nop
  .try
  {
    IL_0001:  nop
    IL_0002:  ldarg.0
    IL_0003:  ldarg.1
    IL_0004:  cgt
    IL_0006:  ldc.i4.0
    IL_0007:  ceq
    IL_0009:  stloc.1
    IL_000a:  ldloc.1
    IL_000b:  brtrue.s   IL_0011
    IL_000d:  ldarg.0
    IL_000e:  stloc.0
    IL_000f:  leave.s    IL_001b
    IL_0011:  ldarg.1
    IL_0012:  stloc.0
    IL_0013:  leave.s    IL_001b
  }  // end .try
  catch [mscorlib]System.Object 
  {
    IL_0015:  pop
    IL_0016:  nop
    IL_0017:  ldc.i4.m1
    IL_0018:  stloc.0
    IL_0019:  leave.s    IL_001b
  }  // end handler
  IL_001b:  nop
  IL_001c:  ldloc.0
  IL_001d:  ret
} // end of method Program::Test1

Test2

.method private hidebysig static int32  Test2(int32 a,
                                              int32 b) cil managed
{
  // 代碼大小       22 (0x16)
  .maxstack  2
  .locals init ([0] int32 CS$1$0000,
           [1] bool CS$4$0001)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldarg.1
  IL_0003:  cgt
  IL_0005:  ldc.i4.0
  IL_0006:  ceq
  IL_0008:  stloc.1
  IL_0009:  ldloc.1
  IL_000a:  brtrue.s   IL_0010
  IL_000c:  ldarg.0
  IL_000d:  stloc.0
  IL_000e:  br.s       IL_0014
  IL_0010:  ldarg.1
  IL_0011:  stloc.0
  IL_0012:  br.s       IL_0014
  IL_0014:  ldloc.0
  IL_0015:  ret
} // end of method Program::Test2

這里我們只需關注紅字高亮的幾行即可。此處我們只關心try區塊,即未發生異常的時候,對于Test1來講,IL代碼多出了8個字節來保存catch的處理代碼,這一點對性能和資源幾乎是微不足道的。

我們看到當Test1執行到IL_000f或者IL_0013的時候,將數據出棧并使用leave.s退出try區塊轉向IL_001b地址,然后將數據入棧并返回。

對于Test2來講,執行到IL_000e或者IL_0012的時候, 直接退出,并將數據入棧然后返回。

這里對幾個關鍵指令簡單介紹一下

nop      do noting

stloc.0    Pop value from stack into local variable 0.

ldloc.0    Load local variable 0 onto stack.

br.s target    branch to target, short form

leave.s target   Exit a protected region of code, short form

下面我們看代碼的實際運行情況,新建一個控制臺Console程序,加入下面代碼:

static void Main(string[] args)
{
    int times = 1000000;    //我們將結果放大100,0000倍
    long l1, l2,l3,l4, s1, s2;

    Console.WriteLine("Press any key to continue");
    Console.Read();

    for (int j = 0; j < 10; j++)
    {
        l1 = DateTime.Now.Ticks;

        for (int i = 0; i < times; i++)
            Test2(2, 4);

        l2 = DateTime.Now.Ticks;
        s1 = l2 - l1;
        Console.WriteLine("time spent:" + s1);

        l3 = DateTime.Now.Ticks;

        for (int i = 0; i < times; i++)
            Test1(2, 4);

        l4 = DateTime.Now.Ticks;
        s2 = l4 - l3;
        Console.WriteLine("time spent:" + s2);
        Console.WriteLine("difference:" + (s2 - s1) + ", rate:" + (float)(s2 - s1) / s1 / times);
    }
}

static int Test1(int a, int b)
{
    try
    {
        for (int i = 0; i < 100; i++) ;  // 模擬長時操縱
        if (a > b)
            return a;
        return b;
    }
    catch
    {
        return -1;
    }
}

static int Test2(int a, int b)
{
    for (int i = 0; i < 100; i++) ;  // 模擬長時操縱
    if (a > b)
        return a;
    return b;
}

運行后可以看到代碼的差異,通常在0.0001%的差別以內。

#p#

第二點:如果發生異常,那么引發或處理異常時,將使用大量的系統資源和執行時間。引發異常只是為了處理確實異常的情況,而不是為了處理可預知的事件或流控制。例如,如果方法參數無效,而應用程序需要使用有效的參數調用方法,則可以引發異常。無效的方法參數意味著出現了異常情況。相反,用戶偶爾會輸入無效數據,這是可以預見的,因此如果用戶輸入無效,則不要引發異常。在這種情況下,請提供重試機制以便用戶輸入有效輸入。

我們經常需要將一個字符串轉換為int,比如將Request.QueryString["id"]這樣的字符串轉換為int,在asp.net 1.x時代,我們常使用下列方式:

try
{
    int id = Int32.Parse("123");
}
catch(){}

這樣的后果是如果出現轉換異常,你將不得不犧牲大量的系統資源來處理異常,即使你沒有編寫任何異常處理代碼。

當然你也可以編寫大量的代碼來檢測和轉換字符串來替代try/catch方式,而從asp.net 2.0以后,框架將這個檢測轉換過程封裝到Int32.TryParse方法中,再也不用蹩腳的try/catch來處理了。

還要補充一點,就是finally中的代碼是始終保證運行的,所以留給大家一個問題,下面代碼執行后a的值是多少:

int a = 2;
try
{
    int i = Int32.Parse("s");
}
catch
{
    a = 1;
    return;
}
finally
{
    a = 3;
}

【編輯推薦】

  1. 基于.NET平臺的分層架構實戰
  2. ASP.NET MVC教程:理解模型、視圖和控制器
  3. ASP.NET MVC教程:創建TaskList應用程序
  4. ASP.NET MVC案例教程
責任編輯:楊鵬飛 來源: 博客園
相關推薦

2013-08-22 17:10:09

.Net異常處理

2016-12-15 13:31:20

Java異常處理經驗

2024-02-21 12:18:00

Java虛擬機JVM

2010-09-06 08:43:13

.NET 4

2010-04-14 09:20:26

.NET多線程

2010-01-05 09:26:13

.NET 4.0

2010-05-27 16:42:26

綜合布線

2009-07-23 16:28:55

2019-10-28 09:53:42

Java開發結構

2009-02-06 14:11:36

ASP.NET.NET全局異常處理

2024-09-24 17:34:05

2012-05-17 08:29:54

PhoneGap誤區

2010-03-17 14:21:47

Windows Emb

2013-04-07 10:01:26

Java異常處理

2009-07-29 17:20:18

應用程序異常

2020-07-02 22:42:18

Java異常編程

2009-06-25 14:05:40

Java應用技巧

2017-12-04 09:22:00

2012-01-11 10:55:02

ASP.NET MVC

2023-06-27 08:55:01

Docker程序NET
點贊
收藏

51CTO技術棧公眾號

久久亚洲中文字幕无码| 精品婷婷色一区二区三区蜜桃| 日本美女bbw| 国产精品麻豆| 激情久久av一区av二区av三区| 久久免费看av| 国产精品国产精品国产专区| 欧美日韩免费| 一区二区亚洲欧洲国产日韩| 深夜福利网站在线观看| 夜鲁夜鲁夜鲁视频在线播放| 国产精品伦理一区二区| 大波视频国产精品久久| 看黄色一级大片| 黄页网站一区| 久久久国产91| 一级片手机在线观看| 免费一级欧美在线大片| 在线视频亚洲一区| av在线播放亚洲| 337p日本欧洲亚洲大胆鲁鲁| 成人午夜电影久久影院| 国产精品欧美亚洲777777| 国产稀缺真实呦乱在线| 欧美肥老太太性生活| 日韩av在线网| 成人做爰www看视频软件| 日韩一区二区三免费高清在线观看| 亚洲va天堂va国产va久| 97超碰在线视| 免费a在线观看| 99久久精品国产一区| 成人在线观看视频网站| 免费精品一区二区| 国产精品资源| 亚州成人av在线| 欧美精品成人久久| 国产精品毛片一区二区在线看| 亚洲美女视频网站| 欧美熟妇精品一区二区蜜桃视频| 国内精品视频| 91精品国产麻豆国产自产在线| 超碰在线97免费| gay欧美网站| 精品国产精品自拍| 国产 日韩 欧美在线| 久草资源在线| 亚洲色图欧洲色图婷婷| 四虎一区二区| www.在线播放| 国产欧美日韩不卡| 日本视频一区二区在线观看| 日本高清中文字幕二区在线| 成人福利视频网站| 国产传媒一区二区三区| 性生活黄色大片| 成人一区在线看| 国产综合欧美在线看| 亚洲精品中文字幕成人片| 国产精品123| 国产精品久久久久久久久久直播 | 日韩欧美在线免费| aa在线免费观看| 超碰aⅴ人人做人人爽欧美| 精品免费在线视频| 日韩视频第二页| 成人看片网站| 欧美日韩国产天堂| 999热精品视频| **爰片久久毛片| 日韩精品免费综合视频在线播放| 国产精品1000部啪视频| 国产午夜一区| 日韩一区二区三区在线播放| 九九热最新地址| 亚洲高清毛片| 国产成人97精品免费看片| 午夜视频网站在线观看| 精品一区二区三区免费播放| y111111国产精品久久婷婷| 亚洲精品久久久久久无码色欲四季 | 欧美激情在线一区二区| 一区二区三区四区| 久久www人成免费看片中文| 午夜精品成人在线视频| 992tv快乐视频| 亚洲妇女成熟| 欧美精品久久久久久久久老牛影院| 日本黄色www| 亚洲毛片免费看| 久久久精品亚洲| 在线能看的av| 久国产精品韩国三级视频| 成人一区二区在线| 国产免费视频在线| 一二三四社区欧美黄| 中文字幕乱码人妻综合二区三区 | 国产高清一区二区三区视频| 亚洲伊人色欲综合网| 欧美一级片中文字幕| 91精品亚洲一区在线观看| 亚洲福利小视频| 黄色一级片一级片| 在线观看视频免费一区二区三区| 国产精品扒开腿做爽爽爽视频| 国产强伦人妻毛片| 国产日韩成人精品| 久久这里只有精品18| 九九九精品视频| 日韩电影网在线| 日韩va亚洲va欧美va清高| 免费在线日韩av| 3d动漫啪啪精品一区二区免费 | 久久电影一区二区| 精品久久久久久久久久久国产字幕| 国产主播一区二区| 日韩福利一区二区三区| 91色在线看| 91麻豆精品国产| 山东少妇露脸刺激对白在线| 亚洲美女视频在线免费观看| 91沈先生在线观看| av国产在线观看| 色伊人久久综合中文字幕| 中文在线字幕观看| 亚洲国产老妈| 91精品在线观| 国产黄在线播放| 欧美色视频日本版| 99精品一区二区三区无码吞精| 图片区亚洲欧美小说区| 国产精品免费观看在线| 女人偷人在线视频| 欧美日韩亚洲一区二区三区| 国产免费无码一区二区| 亚洲精品在线观看91| 成人在线观看视频网站| 免费高清在线观看| 欧美日本一区二区三区| 免费黄在线观看| 免费观看成人av| 亚洲成人a**址| 国产成人福利夜色影视| 中文字幕不卡av| japanese国产在线观看| 国产欧美一区二区三区在线老狼| 日韩手机在线观看视频| 国产欧美日韩精品高清二区综合区| 8090成年在线看片午夜| 天天操天天干天天爱| 亚洲国产中文字幕| 国产a级黄色片| 国产日韩高清一区二区三区在线| 国产一区二区三区无遮挡| а√天堂8资源中文在线| 日韩成人av在线| 自拍偷拍校园春色| 国产精品午夜在线观看| 亚洲综合日韩欧美| 91精品福利| 国产传媒一区| 日韩影片中文字幕| 最新91在线视频| 国产女人高潮的av毛片| 一区二区三区四区av| 人妻av一区二区| 国产视频一区免费看| 日韩免费av一区二区三区| 免费在线成人激情电影| 久久精彩免费视频| 午夜久久久久久噜噜噜噜| 午夜精品福利视频网站| 中文字幕av久久爽一区| 国产在线不卡一卡二卡三卡四卡| 亚洲av综合色区| 欧美日韩一区二区三区在线电影 | 亚洲一区二区三区四区电影 | 熟女视频一区二区三区| 国产一区二区三区免费观看在线| 欧美激情网站在线观看| 日本中文字幕电影在线观看| 欧美伊人久久大香线蕉综合69 | 欧美hd在线| 成人黄视频免费| 日本不卡一二三| 久久国产精品久久久久| 青青草免费在线| 91麻豆精品国产91久久久使用方法| 国产91av视频| 国产精品女同一区二区三区| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 国产91在线视频观看| 日韩大片在线播放| 国产伦精品一区二区三区| 巨胸喷奶水www久久久| 久久99亚洲精品| a√在线中文网新版址在线| 精品久久人人做人人爰| 精品无码一区二区三区的天堂| 亚洲免费观看高清| 黄免费在线观看| www.欧美色图| 无套白嫩进入乌克兰美女| 日韩国产欧美在线播放| a天堂资源在线观看| 青青一区二区三区| 免费久久99精品国产自| 日韩最新av| 国产精品免费看久久久香蕉| segui88久久综合9999| 社区色欧美激情 | 天堂在线一二区| 日韩视频免费观看高清完整版| 麻豆成人免费视频| 午夜婷婷国产麻豆精品| 在线观看亚洲网站| 欧美激情在线一区二区三区| 加勒比精品视频| 国产不卡视频一区| 国产精品999.| 老司机午夜精品99久久| 国产精品动漫网站| 国产欧美二区| 人妻少妇精品久久| 欧美日韩精品一本二本三本| 中文网丁香综合网| 国内成人自拍| 欧美日韩日本网| 天堂在线精品| 精品人伦一区二区三区| 成人av动漫| 操一操视频一区| 免费观看亚洲天堂| 99c视频在线| 精品视频一二| 91亚洲va在线va天堂va国| 成人国产精品一区二区免费麻豆| 国产成人精品视| 无人区在线高清完整免费版 一区二| 97视频在线免费观看| av3级在线| 7777kkkk成人观看| 性欧美xxx69hd高清| 911国产网站尤物在线观看| a级片在线免费观看| 久久久亚洲福利精品午夜| 女人天堂av在线播放| 欧美激情国内偷拍| 黄色美女视频在线观看| 久久久欧美一区二区| wwwwxxxx在线观看| 51视频国产精品一区二区| 狠狠操一区二区三区| 91国产一区在线| 在线精品亚洲欧美日韩国产| 热99精品里视频精品| 国产精品高清乱码在线观看| 国产成人精品电影久久久| 久久精品女人天堂av免费观看 | 国产人妖乱国产精品人妖| 欧美人妻一区二区三区| 国产精品视频yy9299一区| 99久久久免费精品| 亚洲影院在线观看| 国产成人精品一区二三区| 日本精品视频一区二区三区| 伊人网免费视频| 日韩一级视频免费观看在线| 刘亦菲毛片一区二区三区| 日韩精品欧美国产精品忘忧草 | 国产人成亚洲第一网站在线播放| eeuss中文字幕| 一区二区激情视频| 亚洲欧美综合自拍| 制服丝袜中文字幕亚洲| 亚洲第九十九页| 亚洲欧美日韩在线一区| 欧美被日视频| 97视频人免费观看| 成人午夜sm精品久久久久久久| 91久久精品国产91久久性色| 国产精品qvod| 亚洲一区二区自拍偷拍| 国产精品99一区二区| 毛片av免费在线观看| 激情文学综合丁香| 亚洲av无码一区二区三区网址| 国产欧美视频一区二区| 久久精品99国产精| 欧美亚男人的天堂| 亚洲乱色熟女一区二区三区| 国产丝袜一区二区三区| 黄色免费在线观看| 欧美孕妇毛茸茸xxxx| 在线成人免费| 农村寡妇一区二区三区| 91精品久久久久久久蜜月| 日韩激情免费视频| 国产精品 日产精品 欧美精品| 一区二区三区四区免费| 亚洲一区av在线| 伊人网av在线| 亚洲日本aⅴ片在线观看香蕉| 成人免费观看视频大全| 国产成人极品视频| 精品久久ai电影| 97av中文字幕| 久久99精品久久久久久动态图| 天堂久久久久久| 亚洲狠狠爱一区二区三区| 91精品人妻一区二区三区果冻| 精品视频久久久| 久操av在线| 成人网在线免费观看| 国产精品欧美日韩一区| 热99这里只有精品| 国产精品一区二区你懂的| 久久久久久久久福利| 色伊人久久综合中文字幕| 视频一区二区免费| 欧美韩日一区二区| 国产一区二区三区免费在线| 婷婷精品国产一区二区三区日韩| 国产日韩欧美| 国产精品久久不卡| 一区二区三区高清不卡| 国产又粗又大又爽| 色777狠狠综合秋免鲁丝| 中文字幕资源网在线观看免费 | 欧美日韩国产中字| 亚洲国产欧美另类| 欧美成人精品一区二区三区| 日本成人一区二区| 一本色道久久99精品综合| 日韩国产精品久久久久久亚洲| 亚洲国产欧美视频| 狠狠躁夜夜躁久久躁别揉| 色婷婷视频在线| 午夜精品在线视频| 老司机凹凸av亚洲导航| av高清在线免费观看| 成人精品视频网站| 国产成人精品av久久| 欧美精品一区二区三区在线 | 久久久久久无码精品人妻一区二区| 中文字幕在线免费不卡| 国产永久免费视频| 免费91在线视频| av不卡一区二区| 日韩精品xxxx| 久久久精品tv| 中文字幕乱码人妻二区三区| 最近日韩中文字幕中文| 国产精品亚洲成在人线| 亚洲一区二区三区乱码| 韩日av一区二区| 青青草原在线免费观看视频| 精品剧情v国产在线观看在线| rebdb初裸写真在线观看| 欧美日韩亚洲一区二区三区四区| 免播放器亚洲| 9.1片黄在线观看| 欧美一卡2卡3卡4卡| 久色国产在线| 日韩成人在线资源| 国内一区二区在线| 国产无遮无挡120秒| 亚洲色图av在线| 成人黄色理论片| 人人干视频在线| 亚洲国产精华液网站w| 国产日韩欧美一区二区东京热| 久久久久久久97| 中文字幕精品影院| 欧美视频亚洲图片| 亚洲va韩国va欧美va精品| 精品三级久久久久久久电影聊斋| 国产在线精品自拍| 欧美理论在线| 亚洲最大成人网站| 日韩亚洲欧美在线| 一区二区乱码| 一级黄色片播放| 久久精品亚洲麻豆av一区二区| 91精品国产综合久| 青草热久免费精品视频| 久久久国产精品| 99久久久久久久久久| 欧美一区二区在线播放| 一区二区乱码| av在线com| 中文在线免费一区三区高中清不卡| 国内毛片毛片毛片毛片| 国产成人精品一区二区在线| 综合精品一区| 美国精品一区二区| 精品小视频在线| 97久久亚洲| 日韩在线不卡一区| 色综合天天性综合|