C# IOException
最后修改于 2023 年 7 月 5 日
在本文中,我们将展示如何在 C# 中处理 IOExceptions。
处理 I/O 经常会引起错误。.NET 在发生 I/O 错误时会抛出 I/O 异常。基本的 I/O 异常称为 IOException。
还有几种更具体的 I/O 异常
- FileNotFoundException
- DirectoryNotFoundException
- DriveNotFoundException
- PathTooLongException
- OperationCanceledException
这些都派生自基本的 IOException。 处理异常时,我们总是最后处理 IOException。 否则,将不会评估更具体的异常。
异常使用 try/catch 关键字处理。 我们的程序用户应获得易于理解的错误消息。 更多技术细节应留给管理员。 错误通常写入日志文件。
读取文件
根据文档,File.ReadAllText 方法打开一个文本文件,读取文件中的所有文本,然后关闭该文件。 此外,文档还列出了可能抛出的异常。
Program.cs
var filename = "words.txt"; var content = File.ReadAllText(filename); Console.WriteLine(content);
该示例读取文本文件的内容。 如果未进行显式异常处理,则 .NET 会处理异常。
$ dotnet run Unhandled exception. System.IO.FileNotFoundException: Could not find file ...
由于文件丢失,程序失败,并显示 System.IO.FileNotFoundException。
try/catch 关键字
在下一个示例中,我们使用 try/catch 处理可能的错误。
Program.cs
var filename = "words.txt";
try
{
var content = File.ReadAllText(filename);
Console.WriteLine(content);
}
catch (FileNotFoundException e)
{
Console.WriteLine("failed to read file");
Console.WriteLine(e.Message);
}
异常处理的目标之一是向用户提供易于访问的错误消息。 他们不应为异常的技术细节所困扰。
$ dotnet run failed to read file Could not find file '/home/jano/Documents/prog/csharp/ioex/First/words.txt'.
这次我们有了一个更易读的错误消息。
Program.cs
var filename = "words.txt";
try
{
var content = File.ReadAllText(filename);
Console.WriteLine(content);
}
catch (FileNotFoundException e)
{
Console.WriteLine("file was not found");
Console.WriteLine(e.Message);
}
catch (IOException e)
{
Console.WriteLine("IO error");
Console.WriteLine(e.Message);
}
如果我们还捕获了基本的 IOException,则它必须遵循更具体的一个。
网络流
当我们读取和写入网络流时,可能会抛出 I/O 异常。
Program.cs
using System.Text;
using System.Net.Sockets;
using var client = new TcpClient();
var hostname = "webcode.me";
client.Connect(hostname, 80);
using NetworkStream networkStream = client.GetStream();
networkStream.ReadTimeout = 2000;
var message = @"GET / HTTP/1.1
Accept: text/html, charset=utf-8
Accept-Language: en-US
User-Agent: C# program
Connection: close
Host: webcode.me" + "\r\n\r\n";
using var reader = new StreamReader(networkStream, Encoding.UTF8);
byte[] bytes = Encoding.UTF8.GetBytes(message);
try
{
networkStream.Write(bytes, 0, bytes.Length);
Console.WriteLine(reader.ReadToEnd());
}
catch (IOException e)
{
Console.WriteLine("GET request failed");
Console.WriteLine(e.Message);
}
该示例创建一个对网页的 GET 请求。
try
{
networkStream.Write(bytes, 0, bytes.Length);
Console.WriteLine(reader.ReadToEnd());
}
catch (IOException e)
{
Console.WriteLine("GET request failed");
Console.WriteLine(e.Message);
}
网络流的 Write 和 ReadToEnd 方法可能会抛出 I/O 异常。
来源
在本文中,我们研究了 C# 中的 IOExceptions。
作者
列出所有 C# 教程。