Net出現多年之後還是對異常處理一知半解的
有些人認為下面代碼就是一個catch的錯誤用法
catch(Exception e)
{
throw e;
}
首先說明
public int GetAllCount
{
try
{
openDB();
int i =
return i;
}
catch (SqlException sex)
{
throw sex;
}
catch (Exception ex)
{
throw ex;
}
}
public int GetAllCount()
{
openDB(); // 這裡也可能是微軟企業類庫等
int i =
return i;
}
private void openDB()
{
conn
}
假設我們有一個公用方法叫openDB()
這樣的使用就是典型的錯誤使用了
對於異常處理
第一點
關於這一點
static int Test
{
try
{
if (a > b)
return a;
return b;
}
catch
{
return
}
}
static int Test
{
if (a > b)
return a;
return b;
}
使用ILDasm工具查看
thod private hidebysig static int
int
{
// 代碼大小
[
IL_
{
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
} // end
catch [mscorlib]System
{
IL_
IL_
IL_
IL_
IL_
} // end handler
IL_
IL_
IL_
} // end of method Program::Test
Test
thod private hidebysig static int
int
{
// 代碼大小
[
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
IL_
} // end of method Program::Test
這裡我們只需關注紅字高亮的幾行即可
我們看到當Test
對於Test
這裡對幾個關鍵指令簡單介紹一下
nop do noting
stloc
ldloc
br
leave
下面我們看代碼的實際運行情況
static void Main(string[] args)
{
int times =
long l
Console
Console
for (int j =
{
l
for (int i =
Test
l
s
Console
l
for (int i =
Test
l
s
Console
Console
}
static int Test
{
try
{
for (int i =
if (a > b)
return a;
return b;
}
catch
{
return
}
}
static int Test
{
for (int i =
if (a > b)
return a;
return b;
}
運行後可以看到代碼的差異
第二點
我們經常需要將一個字符串轉換為int
try
{
int id = Int
}
catch(){}
這樣的後果是如果出現轉換異常
當然你也可以編寫大量的代碼來檢測和轉換字符串來替代try/catch方式
還要補充一點
int a =
try
{
int i = Int
}
catch
{
a =
return;
}
finally
{
a =
}
小節
From:http://tw.wingwit.com/Article/program/net/201311/13168.html