[英]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
塊中的實際內容。
這將留下三種可能的情況:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.