簡體   English   中英

我的方法應該拋出自己的異常,還是讓.NET拋出文件不存在?

[英]Should my method throw its own exception, or let .NET throw if a file doesn't exist?

這是我的代碼:

public void ReadSomeFile(string filePath)
{
    if (!File.Exists(filePath))
        throw new FileNotFoundException();

    var stream = new FileStream(filePath, ....)
    .....
}

我應該自己拋出異常(請參閱File.Exists檢查)? 如果該文件不存在, FileStream將拋出FileNotFoundException 這里有什么好的編程習慣? 代碼分析說我們應該驗證我們的參數。 但是如果我將該參數直接傳遞給另一個方法(我的或其他代碼)並且該方法本身會拋出異常,那么在我的代碼中驗證參數的優點是什么?

if (File.Exists(f)) { DoSomething(f) } (或否定)是反模式。 可以在這兩個語句之間刪除或創建文件,因此檢查它的存在是沒有意義的。

除此之外,正如評論中所指出的,當File.Exists()可能返回true時,文件的實際打開仍然會因各種原因而失敗。 所以你必須重復錯誤檢查並拋出文件的開頭。

因為您不想重復自己,而是保持代碼DRY,只需嘗試打開文件並讓new FileStream()拋出。 然后你可以捕獲異常,如果你願意,可以重新拋出原始異常或拋出特定於應用程序的異常。

當然調用File.Exists()可以證明是合理的,但不是這種模式。

您的方法稱為ReadSomeFile並以filename作為輸入,因此拋出FileNotFoundException是合理的。 因為你不能通過捕獲異常然后自己拋出它來添加任何值,只需讓.NET拋出它。

但是,如果您的方法是LoadData(databaseName)並且它必須訪問許多文件,捕獲異常並拋出自定義異常可能是有價值的,因為您可以將databaseName與其他有用信息一起添加到異常中。

除了已經給出的答案,你還可以說這取決於你期望發生的事情。

如果要讀取日志文件並且它不存在,是否要拋出錯誤,或者只是一個空字符串(或空字符串數組)?

如果返回一個默認值(如空字符串),我只需將函數內容包裝在try-catch (但僅用於預期的錯誤)並返回catch塊中的默認值,同時返回try塊中的實際內容。

這將留下三種可能的情況:

  1. 返回文件的內容;
  2. 返回默認值,因為發生了預期的錯誤;
  3. .NET拋出錯誤,因為您沒有捕獲該特定錯誤。

讓你正確的方法嘗試打開文件,而你不知道完整的文件名,有些像特殊的文件名(例如設備文件UNC路徑 ):

在某些情況下,其他文件方法可能會失敗,但打開文件是成功的。

特殊文件名的一些示例是:

  • CON
  • NUL
  • COM1,COM2,COM3,COM4
  • \\\\服務器\\共享\\ FILE_PATH
  • \\\\ teela \\ admin $ \\ system32(到達C:\\ WINNT \\ system32)
  • C:.. \\ FILE.TXT
  • \\\\。\\ COM1
  • %TEMP%
  • 和更多...

暫無
暫無

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

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