2009-12-29 57 views
5

當WCF服務關閉時,我會捕獲這樣的異常。如何處理捕捉到的異常

public List<ProjektyEntity> GetProjekty() 
    { 
     try 
     { 
     return this.channel.GetProjekty(); 
     } 
     catch (EndpointNotFoundException exception) 
     { 
      //what to do at this point ? 
     } 
    } 

但我不知道該怎麼在catch做block.I只能返回List<ProjektyEntity>類型的對象我想要寫一個信息給用戶,內容如「服務被關閉「我的表示層是ASP.NET MVC。這種情況有沒有策略?

回答

15

有一個簡單的規則:如果你不知道如何處理異常,不要抓住它。

捕獲它並重新調用null或空列表將會導致您可以做的最糟糕的事情,因爲很難調試錯誤來自哪裏,甚至根本就沒有發生錯誤。如果你這樣做,你會讓開發者把頭髮拉出來。

捕捉異常並將其重新拋出爲throw e;也很糟糕,因爲您丟失了原始堆棧。只有在出現錯誤時,您才需要進行特殊清理,否則使用throw;進行重新配置是有好處的。通常情況並非如此。如果你已經完成了應該完成的清理工作,無論是否存在錯誤,它都屬於finally子句。

所以一般情況下,除非有一些明智的做法,你可以從錯誤中恢復,讓異常傳播給調用者。這是如何設計例外的。

有一些時候,你可能要趕上一個例外,添加更多的信息(例如,用於日誌記錄),在這種情況下,你應該確保您使用的InnerException以避免丟失原來的信息:

try 
{ 
    foo(bar); 
} 
catch (Exception e) 
{ 
    throw new FooException("Foo failed for " + bar.ToString(), e); 
} 

但總的來說最好不要這樣做,除非你有一個很好的理由。這樣做可以防止用戶捕獲特定類型的異常 - 它們將捕獲您的異常,然後他們需要打開InnerException的類型。不好玩。讓調用者看到最初的異常。

+2

這聽起來像你應該只在你的表示層處理這個異常 - 例外應該是例外。如果您可以根據發生的異常執行不同的邏輯路徑,則只處理異常。 – 2009-12-29 11:14:16

4

在我看來,你不應該在這一層捕獲這個例外;您應該讓異常傳播到控制器層,並讓控制器層顯示消息。

8

我可以在這裏看到幾個選項。確定哪個是合適的可能取決於應用程序。

  • 顯示錯誤並返回null。乾淨簡單,但不靈活。在使用此功能的每種情況下,可能都不是您想要的。
  • 不要捕捉它,讓調用者捕獲這個異常。它可以更容易地確定從調用函數中的適當的響應(即,顯示一條消息/重試在幾秒鐘/等)
  • 捕獲它,並拋出一個新ServiceNotAvailableException略多於選項2較爲複雜,但將讓你的代碼更清晰。
  • 只返回null。可能是最不可取的方法,除非這種服務被關閉是常見的,沒有什麼大不了的。
1

創建具有足夠的調試信息的異常對象,並將其扔調用方法

2

不應該例外被捕獲並在這方面處理。一般來說,它需要在更高級別上處理任何控制檯。

您可以在這裏做的最好的事情就是記錄具有必要細節的異常,並正確地重新推出。

4

有幾種方法:

1)不要捕獲異常,並讓來電者(用戶界面層)處理它

2)捕獲異常,所以你可以做任何你需要這樣做,然後再扔掉它

catch (EndpointNotFoundException exception) 
{ 
    CleanUpMyOwnState(); 
    throw;     // Pass the exception on the to the caller to handle 
} 

3)異常轉換成另一種類型(以使其更容易在來電處理):

catch (EndpointNotFoundException exception) 
{ 
    CleanUpMyOwnState(); 
    throw new InvalidOperationException("Endpoint was not found", exception); 
} 

4)抓住它,然後返回一個錯誤代碼(如空),所以調用者不需要使用異常處理來處理它(但沒有真正的好處,這樣做)

5 )捕捉異常並自行向用戶報告錯誤。這可能是一個壞主意 - 你應該在UI層保留所有的錯誤報告。

0
public List<ProjektyEntity> GetProjekty() 
    { 
     try 
     { 
     return this.channel.GetProjekty(); 
     } 
     catch (EndpointNotFoundException exception) 
     { 
      'Write here Some Clean Up Codes 
      ' Log it somewhere on your server so that you can fix the error 

     } 
    }