簡體   English   中英

在處理目錄/文件時,通常應該使用“ if”還是“ try”

[英]Should I generally use “if” or “try” when working with directories/files

通常,當我處理文件和目錄時,我想檢查一個目錄或文件的路徑是否存在,我只是使用類似這樣的東西:

if (Directory.Exists(path))
{
     //Something...
}

但是,如果我正確理解了這個答案,建議允許仍然拋出異常,這意味着不要使用if ,而要使用try.. catch

這是使用文件和目錄時的通用方法,還是有時最好使用if(Directory.Exists...或類似的方法?

注意 :在看到第一個響應之后,只想澄清某些目錄/路徑可能不存在的情況是正常現象。

您幾乎總是必須在某個地方捕獲異常,尤其是對於I / O錯誤,以免程序在發生異常時被殺死。

在許多情況下,首先檢查有效輸入也是有意義的(例如Directory.Exists() )。 這使您能夠以一種用戶友好的方式高效地報告並響應明顯的用戶錯誤情況。

但是您不能保證在執行該調用與嘗試以某種方式訪問​​該目錄之間不會刪除該目錄。 否則,如果目錄位於遠程共享上,則網絡不會失敗。 否則您將不會遇到其他類型的I / O錯誤。

有一些例外情況值得一提。 例如,發生意外的OutOfMemoryException (與某些數據結構變得過大相反),或其他類型的內部.NET故障。 從這些類型的錯誤中恢復的可能性很小。 但是對於其他任何事情,您在某個時候都應該捕獲可能發生的異常。 有時,這僅表示頂級catch (Exception e) ,您可以在其中以某種方式記錄異常,然后干凈地退出程序。

(我會注意到,未捕獲的異常會導致應用程序終止,通常會記錄在系統事件日志中。因此,只要用戶可以方便地檢查日志並從那里檢索異常信息,那么就不必捕獲所有例外…只是那些您知道該怎么做的例外。

100%取決於您要實現的目標。

如果路徑無效,並且您想將其告知用戶,則可以選擇更適合您的代碼體系結構的方式來選擇返回成功值還是引發異常。

在其他情況下,如果某些地方可能出了問題而無需用戶負責或需要通知,則通常會引發異常,並在適當的位置將其放入catch塊中。

要記住的是,您始終可以執行if檢查並在狀態無效的情況下拋出自己的異常,而不是讓無效狀態本身導致異常。 主要的區別在於拋出異常(堆棧跟蹤,消息等)的數據,但也可以表示為性能(如果您要先執行低成本的操作,則不希望嘗試進行昂貴的操作)檢查以確保它會成功)。 嘗試捕獲塊也增加了開銷的BIT,但我認為這並不重要。

要提出的問題是:

  • 無效狀態會導致整個上方操作失敗嗎?
  • 代碼在哪里以及如何處理無效狀態?
  • 代碼是否“修復”無效狀態並重試?
  • 無效狀態是由用戶錯誤還是代碼問題引起的?
  • 與驗證檢查的成本相比,該操作的成本如何?

編輯:查看注釋中的Yuval鏈接,以更好地理解try-catch塊的成本。

驗證檢查幾乎總是很低成本的,因此總而言之,我會說:即使您打算在無效狀態下拋出自己的異常,也要執行檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM