2013-10-29 70 views
0

嘗試之間的區別...趕上並嘗試....終於?在asp.net(C#)TRY .... CATCH和TRY之間有什麼區別.....最後?

就像當我想趕上像1/0錯誤,然後我把代碼放在try塊中,並把異常對象放在catch塊,如response.write(「ERROR:」+ ex.Message)但顧問告訴我,總是把握並不是一個好習慣,它會在不通知的情況下吸收錯誤? ehhhhh?但它通過ex.Message做到了,爲什麼? 和什麼試....最後呢?我知道它用於釋放資源,但是如果異常無法捕獲,那麼TRY的用途是什麼?

+1

你看看[try-catch-finally(C#Reference)](http://msdn.microsoft.com/en-us/library/vstudio/dszsf989.aspx)。一個簡單的谷歌搜索將回答你的問題。 – Harrison

+0

是的,但不能得到我想要的 – Hunain

回答

2

Eveything括在你的finally塊確保被執行,這可能是這2有用具體案例至少有:

  • 有時你決定在你的try塊中間調用return並返回t o調用者:finally這裏簡化了釋放資源的過程,您不必編寫一些特定的代碼直接進入方法的末尾。
  • 有時你想讓一個異常上升(通過不捕捉它),也許被抓到更高的層次(因爲它不是適當的地方,例如正確處理它)。 finally再次確保您的資源被釋放,異常繼續其路徑。

也許你可以看到finally作爲一種工具,幫助開發人員以更少的努力完成他們所要做的事情。另一方面,catch專門用於處理錯誤。

這兩個關鍵字都是專門用於流量控制,但它們沒有相同的目的,可以互相使用(通常都是!)。這取決於你的需求。

1

無論是否存在異常,最後總是執行。如果你想絕對確定某些東西被清理了,這可能很方便。 Example

void ReadFile(int index) 
{ 
    // To run this code, substitute a valid path from your local machine 
    string path = @"c:\users\public\test.txt"; 
    System.IO.StreamReader file = new System.IO.StreamReader(path); 
    char[] buffer = new char[10]; 
    try 
    { 
     file.ReadBlock(buffer, index, buffer.Length); 
    } 
    catch (System.IO.IOException e) 
    { 
     Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message); 
    } 

    finally 
    { 
     if (file != null) 
     { 
      file.Close(); 
     } 
    } 
    // Do something with buffer... 
} 

如果您沒有在那裏有一個最終有可能的是,文件將不能正確,如果發生錯誤關閉。無論是否發生錯誤,您都希望文件在完成後關閉。

考慮替代方案:

void ReadFile(int index) 
{ 
    // To run this code, substitute a valid path from your local machine 
    string path = @"c:\users\public\test.txt"; 
    System.IO.StreamReader file = new System.IO.StreamReader(path); 
    char[] buffer = new char[10]; 
    try 
    { 
     file.ReadBlock(buffer, index, buffer.Length); 
     file.Close(); 
    } 
    catch (System.IO.IOException e) 
    { 
     Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message); 
    } 
} 

如果您在ReadBlock錯誤出來的文件將無法正確關閉。

4

的try/catch /最後:

try 
{ 
    // open some file or connection 
    // do some work that could cause exception 
} 
catch(MyException ex) 
{ 
    // do some exception handling: rethrow with a message, log the error, etc... 
    // it is not a good practice to just catch and do nothing (swallow the exception) 
} 
finally 
{ 
    // do some cleanup to close file/connection 
    // guaranteed to run even if an exception happened in try block 
    // if there was no finally, and exception happened before cleanup in your try block, file could stay open. 
} 

嘗試/最後:

try 
{ 
    // open some file/connection 
    // do some work, where you're not expecting an exception 
    // or, you don't want to handle the exception here, rather just let it go to the caller, so no need for a catch 
} 
finally 
{ 
    // do cleanup, guaranteed to go in this finally block 
} 
+1

因爲有人告訴他簡單的捕獲是不好的,讓我們另外注意catch(Exception ex)通常比捕獲你知道可以拋出的特定異常更糟糕。這可能是他不明白的,儘管他的問題聽起來像是作業。 – Magus

+0

它完成了,不,它不是鋤頭,我是一個專業的網絡工程師,雖然初學者,但我和我敢肯定,你們會很快帶我到專家級別,你們搖滾:) – Hunain