2012-03-08 87 views
10

這個問題更多的是什麼是正確的方式做一些事情......和try/catch語句嵌套

的問題...有沒有using塊和try/catch之間的適當嵌套順序?

套住try/catch中的整個using聲明並保持using塊的優點是可以的嗎? (或者會導致使用語句的關閉部分被拋出窗口)

或者你應該在using語句中嵌套try/catch,並且只圍繞執行數據庫訪問的語句?

是...

try { 
    using(tsmtcowebEntities db = new tsmtcowebEntities()) { 
      violationList = (from a in db.DriverTrafficViolationDetails 
          where a.DriverTrafficViolation.DriverApplicationId == DriverAppId 
          orderby a.DateOfOccurance descending 
          select a).ToList<DriverTrafficViolationDetail>(); 
      GeneralViolation = (from a in db.DriverTrafficViolations 
           where a.DriverApplicationId == DriverAppId 
           select a).FirstOrDefault(); 
    } 
} catch { } 

小於/更正確的...

using(tsmtcowebEntities db = new tsmtcowebEntities()) { 
    try { 
      violationList = (from a in db.DriverTrafficViolationDetails 
          where a.DriverTrafficViolation.DriverApplicationId == DriverAppId 
          orderby a.DateOfOccurance descending 
          select a).ToList<DriverTrafficViolationDetail>(); 
      GeneralViolation = (from a in db.DriverTrafficViolations 
           where a.DriverApplicationId == DriverAppId 
           select a).FirstOrDefault(); 
    } catch { } 
} 
+0

你真的需要在所提供的代碼的應用程序的所有細節?我認爲一個簡單的例子就足夠了。 – 2012-03-08 05:09:16

+1

空的catch塊是一個非常糟糕的編程習慣。不要這樣做!你會後悔的。 – phoog 2012-03-08 05:34:06

+0

@JonathonReinhart對於我來說,複製和粘貼一段代碼比構成一個例子更簡單。當我覺得把代碼放在這個世界可能會很糟糕時,我編寫代碼。在這種情況下,我看不到任何消極因素,爲什麼不呢? – Jared 2012-03-08 19:38:02

回答

5

後者更好:它將避免掩蓋異常最終拋出dy dispose。看到這個article.

+1

+1指出了這一點:不過,拋出異常處置任何已經在我的書:( – 2012-03-08 05:38:51

+0

「壞」除非你明確地想趕上像使用using語句東西引發的錯誤(的FileStream FS =新的FileStream(。 ...可以很容易地拋出,如果路徑無效或無法訪問,甚至更可能拋出比你使用塊的內容。 – 2013-07-08 20:18:42

0

我會建議放置的try/catch在使用中,因爲無論一個異常是否是扔你應該處理的類型一次性實體的容器

+0

我想這是我的問題的一部分。我在使用中嵌套try/catch的功能方面100%肯定。我更不確定一個使用語句是否可以處理反轉並仍然處理對象/資源......我有一些我正在處理的代碼,它現在是兩種方式。我試圖找出是否需要通過代碼,並確保try/catch總是嵌套或不嵌套。您已經確認了我最初的預期,但我會接受答案! @GlennFerrieLive – Jared 2012-03-08 05:08:16

+0

'using'自己嘗試抓住。 'dispose'函數將一直被調用。 – 2012-03-08 05:10:23

+1

-1不管嵌套如何,都會調用Dispose。 @Jared:使用被編譯爲try-finally(而不是像J.N.所說的try-catch)。在finally塊中調用Dispose,因此調用是否捕獲或處理異常。 – phoog 2012-03-08 05:27:00

2

這是一個真正的風格問題,你想保持多大的範圍db

如果使用位於try/catch塊內部,db變量只能在try部分中訪問。

如果使用位於try/catch塊之外,它將在catch部分中可見。

無論如何,變量將被正確處置,因爲使用塊相當於try/finally。

就我個人而言,我會想知道爲什麼你需要在那裏捕捉異常,以及如果有什麼,你可以用它們做什麼。

+0

我經常使用try/catch爲通過ajax調用的操作設置響應的狀態碼。 – Jared 2012-03-08 19:47:21

1

using巢預測與try/catchDispose將被稱爲所有的路徑。可預測地意味着控制總是從內部 - >外部範圍(對於例外和正常流量回報)的流量。

接下來的問題是:應該可以在關係到Dispose執行什麼的範圍是什麼?對此的答案將因代碼而異,但如果需要訪問db,則必須顯示「在內部」,如果代碼執行作爲 * using *的一部分,則可能是異常的來源。

(另外,空的catch塊是噁心!我假設他們在那裏「爲示範的目的」。)

編碼愉快。


*請注意,外抓來抓從new tsmtcowebEntities()或(如J.N.指出)的Dispose,應該存在任何拋出的異常。 (這是另一個話題完全如果可以接受的任一構建拋出異常;-)我喜歡捕捉異常接近源儘可能讓例外,我不知道該如何應對「流出」未捕獲在某些頂層構造(例如事件處理程序)中。

+0

其實我有他們在我的代碼的一些地方,只是因爲我有ELMAH集捕捉任何例外:在我的待辦事項列表中,我將回顧並重新分析大量代碼,並且我的try/catch塊是其中一個區域,並改進了我的錯誤日誌記錄設置。 – Jared 2012-03-08 19:45:43