2011-06-30 33 views
2

編輯:請注意,這與我以前的問題無關。這是另一個主題。在Unnatended Services中處理例外

我正在寫一個應用程序,每30秒左右運行一次,以便在數據庫中進行一些未經處理的工作。它絕對不需要監督或用戶/管理員交互。但是,它需要在其App.config文件中正確定義某些參數,並且應用程序啓動時可訪問該數據庫。此外,所有可能發生的異常都需要記錄下來,但是程序可以很好地退出,因爲它會在30秒後執行......在此間隔內需要完成的唯一一件事是確保數據庫是可訪問和所有參數都是正確的。也就是說,是否可以接受/更正方法DoWork()的方法中的整個行爲,在方法內部沒有任何異常處理,然後把它放在Main()方法中?

try 
{ 
    DoWork(); 
} 
catch (Exception ThisException) 
{ 
    /* Log exception. */ 
} 

回答

1

對大多數例子來說應該是可以的。就像上面說的關閉數據庫連接和清理使用的資源是不能跳過的。保持打開的文件句柄可能很糟糕,並阻止新的運行。

此外,還有一些致命的異常(OutOfMemory,RunTimeException等)應該被記錄或引發某種形式的警報。

1

這取決於DoWork()所做的。

如果您打開和關閉文件或數據庫連接,例如您將需要特定的錯誤處理來安全地處理這些資源。

儘管如此,讓「抓住所有人」嘗試捕捉也沒有任何壞處。

+0

嘗試「使用」的語句,這些應該清理你的資源在異常情況下使用。 –

0

錯誤處理需要具體。如果你預計你的配置可能是錯誤的,那麼做一個檢查,而不是拋出異常。如果需要拋出異常,請特別寫一個try ... catch。如果配置錯誤,你想怎麼做?關閉服務?使用默認設置?

捕獲所有可能是危險的,因爲任何拋出並被CLR捕獲的異常將被捕獲在該塊中。如果你發現了一個例外,那麼這個想法就是以某種方式處理它。如果該異常是內存不足異常,會發生什麼情況?文件IO?或數據庫?

一些MSDN文章備份我在說什麼:

http://msdn.microsoft.com/en-us/library/xtd0s8kd.aspx

http://msdn.microsoft.com/en-us/library/seyhszts.aspx

+0

我特別說過,這會隨時都會發生,所以你提到的那兩個例外都沒有問題。 – User

+0

你的代碼的頻率如何影響異常會被拋出?我試圖建議你的異常處理應該是特定的,而不是一般的。 – Jay