顯然,很多應用程序需要處理文件並向用戶顯示錯誤。然而System.IO.File類的成員會拋出很多異常。這些只是爲ReadAllText:C# - 這是一個很好的實踐來簡化由System.IO.File.ReadAllText產生的異常
- 的ArgumentException
- ArgumentNullException
- PathTooLongException
- DirectoryNotFoundException
- IOException異常
- UnauthorizedAccessException
- FileNotFoundException異常
- NotSupportedException異常
- 拋出:SecurityException
因此,如何趕上他們並將其展示給用戶,而不是吞嚥其他異常?
顯然與完美編碼可以消除這些2:
- 的ArgumentException
- ArgumentNullException
如果你寫一個(可能是痛苦的)檢查您可以消除PathTooLongException。但是,爲什麼要複製微軟編寫的檢查代碼?
但其他例外仍然可以,即使你做了所有的檢查發生:
- DirectoryNotFoundException
- IOException異常
- UnauthorizedAccessException
- FileNotFoundException異常
- NotSupportedException異常
- 拋出:SecurityException
文件和文件夾可以用您打開該文件時被刪除,安全權限可以改變等
我不明白,你可以在這些情況下做什麼,除了顯示消息的用戶。你會找到操作系統無法找到的目錄嗎?修復權限?將代碼注入OS以支持不受支持的操作? LOL 我看到的所有可能是顯示一條錯誤消息。
因此,如果每次打開文件以讀取文本時都必須捕獲所有這些異常,那麼我的代碼就必須很長且重複,除非通過捕獲異常來吞服異常。
創建FileException並僅捕獲實際使用文件時可能出現的所有異常是否是一種好的做法? 我腦子裏想的是這樣的:
public class FileException : Exception
{
public FileException(Exception e)
: base(e.Message, e.InnerException)
{
}
}
public static class FileNoBS
{
public static string ReadAllText2(string path)
{
try
{
return File.ReadAllText(path);
}
catch (ArgumentNullException e)
{
throw new FileException(e);
}
catch (ArgumentException e)
{
throw new FileException(e);
}
catch (PathTooLongException e)
{
throw new FileException(e);
}
catch (DirectoryNotFoundException e)
{
throw new FileException(e);
}
catch (FileNotFoundException e)
{
throw new FileException(e);
}
catch (IOException e)
{
throw new FileException(e);
}
catch (UnauthorizedAccessException e)
{
throw new FileException(e);
}
catch (NotSupportedException e)
{
throw new FileException(e);
}
catch (SecurityException e)
{
throw new FileException(e);
}
}
}
然後捕捉異常,當我只需要這樣寫:
try
{
string text = FileNoBS.ReadAllText2(path);
}
catch (FileException e)
{
// display error to user
}
我真的不明白,爲什麼微軟沒有分組的所有這些異常togather某種程度上來說。我錯過了什麼,或者這是一個好習慣嗎?
但是這樣的實際結果是什麼?對於所有這些例外情況,您都不做任何具體的事情如果你真的必須爲每一個做不同的事情,你最終會以同樣的方式測試每一個。只抓住通用異常並打印其消息 – Steve
目的不是吞下異常,我什麼也做不了。我可以做一些特定的事情 - 向用戶顯示發生錯誤。 – Marko
@Steve然後你會錯過StackOverflow或OutOfMemory異常。目前的代碼只關注文件例外。 – Artemix