2012-10-16 74 views

回答

38

這兩種方法都會捕獲所有異常。除了第一個代碼示例會生成編譯器警告,因爲ex已被聲明但未被使用,您的兩個代碼示例之間沒有顯着差異。

但請注意,一些例外情況是特殊的,會自動重新排列。

ThreadAbortException是一個特殊的例外,可以被捕獲,但它會自動在catch塊結束時再次提出。

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx


正如在評論中提到的,它通常是一個非常糟糕的主意趕上並忽略所有例外。通常您想要執行以下其中一項操作:

  • 捕獲並忽略您知道的並非致命的特定異常。

    catch (SomeSpecificException) 
    { 
        // Ignore this exception. 
    } 
    
  • 捕獲並記錄所有異常。

    catch (Exception e) 
    { 
        // Something unexpected went wrong. 
        Log(e); 
        // Maybe it is also necessary to terminate/restart the application. 
    } 
    
  • 捕獲所有異常,做一些清理,然後重新拋出異常。

    catch 
    { 
        SomeCleanUp(); 
        throw; 
    } 
    

注意的是,在最後一種情況異常被重新拋出使用throw;而不是throw ex;

+0

但是不幸的是,在發佈模式下,這將不會捕獲所有的異常:/ – Muflix

+3

Muflix能詳細說明爲什麼catch {}不會捕獲所有異常釋放模式[?]? –

1

兩者都很好,但只有第一個可以讓你檢查異常本身。

兩者都吞下異常,你應該只捕捉異常來做一些有意義的事情。隱藏一個問題是不是有意義!

0

兩種方式都是正確 如果你需要做的異常物體東西在catch塊比你應該使用

try { 
code.... 
} 
catch (Exception ex){} 

,比catch塊使用前。

無論如何,這並不總是一個很好的做法來引導異常類,這是一個更具體的異常的實踐 - 一個你可以期待的異常。

3

所有例外都來自Exception,所以上述兩者都可以使用。

我會問爲什麼你想這樣做,但。你只應該捕獲可以恢復的異常。其他一切都會讓你的應用程序死於可怕的熾烈死亡。應用程序崩潰比繼續可能的損壞狀態更好。

+0

我不想處理這個異常。我只是希望我的程序不會崩潰,如果它發生... –

+0

那麼,出現了什麼問題,你不打算讓用戶知道它發生了什麼?... –

+4

實際上有多種可能的用例這個。當從Web服務批量獲取(例如)多個(50 000+)資源時,我絕對想要捕獲所有可能的錯誤(包括但不限於:無效http錯誤,服務超時,返回500內部服務器錯誤的服務),記錄它們,然後繼續。這裏的重點是,我還不知道這個工作可能會因個人網絡通話而失敗的所有方式。 –

2

請注意,除了所有其他評論有一個小的差異,這裏應該提到的完整性!

使用空的catch子句,您可以在程序集標記爲「RuntimeCompatibility(WrapNonExceptionThrows = false)」(默認爲CLR2時爲true)時捕獲非CLSCompliant異常。 [1] [2] [3]

[1] http://msdn.microsoft.com/en-us/library/bb264489.aspx

[2] http://blogs.msdn.com/b/pedram/archive/2007/01/07/non-cls-exceptions.aspx

[3] Will CLR handle both CLS-Complaint and non-CLS complaint exceptions?

1

我捕獲所有的異常,並將其存儲在數據庫中,因此錯誤可以很容易地被糾正 - 網頁,地點,日期等存儲

try 
{  
    Cart = DB.BuyOnlineCartMasters.Where(c => c.CmpyID == LoginID && c.Active == true).FirstOrDefault(); 
} 
catch (Exception e) 
{ 
    ErrorReport.StoreError("CartMinifiedPartial-Company", e); 
    -- storing the error for reference 
} 

存儲

public static void StoreError(string ErrorPage, Exception e) 
    { 
     try 
     { 
      eDurar.Models.db_edurarEntities1 DB = new Models.db_edurarEntities1(); 
      eDurar.Models.ErrorTable Err = new eDurar.Models.ErrorTable(); 
      Err.ErrorPage = ErrorPage; 
      if (e.Message != null) 
      { 
       Err.ErrorDetails = e.Message; 
      } 
      if (e.InnerException != null) 
      { 
       Err.InnerException = e.InnerException.Message.ToString(); 
      } 

      Err.Date = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time")); 
      DB.ErrorTables.AddObject(Err); 
      DB.SaveChanges(); 
} 
0
static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    } 

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
+0

代碼只是答案不是很好的答案,嘗試添加幾行解釋問題是什麼以及代碼如何修復它 – MikeT

-1

嘗試 {

.. .. ..

}

趕上(例外前){

.. .. ..

} Exception ex意味着所有的例外。